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

模拟服务器

开发平台:

C/C++

  1. /*******************************************************************************
  2. // FileName : ScriptFuns.cpp
  3. // FileAuthor : RomanDou
  4. // FileCreateDate : 2002-11-19 15:58:20
  5. // FileDescription : 脚本指令集
  6. // Revision Count :
  7. *******************************************************************************/
  8. #ifndef WIN32
  9. #include <string>
  10. #endif
  11. #include "KWin32.h"
  12. #include "KEngine.h"
  13. #include "KDebug.h"
  14. #include "KStepLuaScript.h"
  15. #include "LuaLib.h"
  16. #include "KScriptList.h"
  17. #include <string.h>
  18. #include "LuaFuns.h"
  19. #include "KCore.h"
  20. #include "KNpc.h"
  21. #include "KSubWorld.h"
  22. #include "KObjSet.h"
  23. #include "KItemSet.h"
  24. //#include "KNetClient.h"
  25. #include "KScriptValueSet.h"
  26. #include "KNpcSet.h"
  27. #include "KPlayerSet.h"
  28. #include "KPlayer.h"
  29. #include "KSubWorldSet.h"
  30. #include "KProtocolProcess.h"
  31. #include "KBuySell.h"
  32. #include "KTaskFuns.h"
  33. #include "KPlayerDef.h"
  34. #include "TaskDef.h"
  35. #ifdef _SERVER
  36. //#include "KNetServer.h"
  37. //#include "../MultiServer/Heaven/interface/iServer.h"
  38. #include "KNewProtocolProcess.h"
  39. #endif
  40. #include "KSortScript.h"
  41. #ifndef __linux
  42. #include "Shlwapi.h"
  43. #include "windows.h"
  44. #include "winbase.h"
  45. #include <direct.h>
  46. #else
  47. #include "unistd.h"
  48. #endif
  49. #ifdef _STANDALONE
  50. #include "KSG_StringProcess.h"
  51. #else
  52. #include "../../Engine/Src/KSG_StringProcess.h"
  53. #endif
  54. #ifndef WIN32
  55. typedef struct  _SYSTEMTIME
  56. {
  57.     WORD wYear;
  58.     WORD wMonth;
  59.     WORD wDayOfWeek;
  60.     WORD wDay;
  61.     WORD wHour;
  62.     WORD wMinute;
  63.     WORD wSecond;
  64.     WORD wMilliseconds;
  65. } SYSTEMTIME;
  66. typedef struct  _FILETIME
  67. {
  68.     DWORD dwLowDateTime;
  69.     DWORD dwHighDateTime;
  70. } FILETIME;
  71. #endif
  72. inline const char* _ip2a(DWORD ip) { in_addr ia; ia.s_addr = ip; return inet_ntoa(ia); }
  73. inline DWORD _a2ip(const char* cp) { return inet_addr(cp); }
  74. KScriptList g_StoryScriptList;
  75. KStepLuaScript * LuaGetScript(Lua_State * L);
  76. int GetPlayerIndex(Lua_State * L);
  77. extern int g_GetPriceToStation(int,int);
  78. extern int g_GetPriceToWayPoint(int,int);
  79. extern int g_GetPriceToDock(int ,int );
  80. //BitValue = GetBit(Value, BitNo)
  81. int LuaGetBit(Lua_State * L)
  82. {
  83. int nBitValue = 0;
  84. int nIntValue = (int)Lua_ValueToNumber(L, 1);
  85. int nBitNumber = (int)Lua_ValueToNumber(L, 2);
  86. if (nBitNumber >= 32 || nBitNumber <= 0) 
  87. goto lab_getbit;
  88. nBitValue = (nIntValue & (1 << (nBitNumber - 1))) != 0;
  89. lab_getbit:
  90. Lua_PushNumber(L, nBitValue);
  91. return 1;
  92. }
  93. //NewBit = SetBit(Value, BitNo, BitValue)
  94. int LuaSetBit(Lua_State * L)
  95. {
  96. int nIntValue = (int)Lua_ValueToNumber(L, 1);
  97. int nBitNumber = (int)Lua_ValueToNumber(L, 2);
  98. int nBitValue = (int)Lua_ValueToNumber(L,3);
  99. nBitValue = (nBitValue == 1);
  100. if (nBitNumber > 32 || nBitNumber <= 0) 
  101. goto lab_setbit;
  102. nIntValue = (nIntValue | (1 << (nBitNumber - 1)));
  103. lab_setbit:
  104. Lua_PushNumber(L, nIntValue);
  105. return 1;
  106. }
  107. //ByteValue = GetByte(Value, ByteNo)
  108. int LuaGetByte(Lua_State * L)
  109. {
  110. int nByteValue = 0;
  111. int nIntValue = (int)Lua_ValueToNumber(L, 1);
  112. int nByteNumber = (int)Lua_ValueToNumber(L, 2);
  113. if (nByteNumber > 4 || nByteNumber <= 0) 
  114. goto lab_getByte;
  115. nByteValue = (nIntValue & (0xff << ((nByteNumber - 1) * 8) )) >> ((nByteNumber - 1) * 8);
  116. lab_getByte:
  117. Lua_PushNumber(L, nByteValue);
  118. return 1;
  119. }
  120. //NewByte = SetByte(Value, ByteNo, ByteValue)
  121. int LuaSetByte(Lua_State * L)
  122. {
  123. BYTE * pByte = NULL;
  124. int nIntValue = (int)Lua_ValueToNumber(L, 1);
  125. int nByteNumber = (int)Lua_ValueToNumber(L, 2);
  126. int nByteValue = (int)Lua_ValueToNumber(L,3);
  127. nByteValue = (nByteValue & 0xff);
  128. if (nByteNumber > 4 || nByteNumber <= 0) 
  129. goto lab_setByte;
  130. pByte = (BYTE*)&nIntValue;
  131. *(pByte + (nByteNumber -1)) = (BYTE)nByteValue;
  132. //nIntValue = (nIntValue | (0xff << ((nByteNumber - 1) * 8) )) ;
  133. lab_setByte:
  134. Lua_PushNumber(L, nIntValue);
  135. return 1;
  136. }
  137. #ifdef _SERVER
  138. int LuaModifyRepute(Lua_State *L)
  139. {
  140. if (Lua_GetTopIndex(L) <1) 
  141. return 0;
  142. int nPlayerIndex = GetPlayerIndex(L);
  143. if (nPlayerIndex < 0)
  144. return 0;
  145. int nValue = (int)Lua_ValueToNumber(L,1);
  146. Player[nPlayerIndex].m_cTask.SetSaveVal(TASKVALUE_REPUTE, Player[nPlayerIndex].m_cTask.GetSaveVal(TASKVALUE_REPUTE) + nValue);
  147. if (nValue < 0)
  148. {
  149. char szMsg[100];
  150. sprintf(szMsg, "您的声望减少了%d点!", -nValue);
  151. // KPlayerChat::SendSystemInfo(1, nPlayerIndex, MESSAGE_SYSTEM_ANNOUCE_HEAD, (char *) szMsg, strlen(szMsg) );
  152. }
  153. else
  154. {
  155. char szMsg[100];
  156. sprintf(szMsg, "您的声望增加了%d点!", nValue);
  157. // KPlayerChat::SendSystemInfo(1, nPlayerIndex, MESSAGE_SYSTEM_ANNOUCE_HEAD, (char *) szMsg, strlen(szMsg) );
  158. }
  159. return 0;
  160. }
  161. int LuaGetRepute(Lua_State *L)
  162. {
  163. int nValue = 0;
  164. int nPlayerIndex = GetPlayerIndex(L);
  165. if (nPlayerIndex < 0)
  166. goto lab_getrepute;
  167. nValue = Player[nPlayerIndex].m_cTask.GetSaveVal(TASKVALUE_REPUTE);
  168. lab_getrepute:
  169. Lua_PushNumber(L, nValue);
  170. return 1;
  171. }
  172. #endif
  173. int GetSubWorldIndex(Lua_State * L)
  174. {
  175. Lua_GetGlobal(L, SCRIPT_SUBWORLDINDEX);
  176. if (lua_isnil(L,Lua_GetTopIndex(L)))
  177.         return -1;
  178. int nIndex = (int)Lua_ValueToNumber(L, Lua_GetTopIndex(L));
  179.     if (nIndex >= MAX_SUBWORLD || nIndex <= 0) 
  180. {
  181. _ASSERT(0);
  182. return -1;
  183. }
  184. if (SubWorld[nIndex].m_nIndex >= MAX_SUBWORLD || SubWorld[nIndex].m_nIndex < 0)
  185. {
  186. _ASSERT(0);
  187. return -1;
  188. }
  189.     return nIndex;
  190. }
  191. //Idx = SubWorldID2Idx(dwID)
  192. int LuaSubWorldIDToIndex(Lua_State * L)
  193. {
  194. int nTargetSubWorld = -1;
  195. int nSubWorldID = 0;
  196. if (Lua_GetTopIndex(L) < 1)
  197. goto lab_subworldid2idx;
  198. nSubWorldID = (int)Lua_ValueToNumber(L, 1);
  199. nTargetSubWorld = g_SubWorldSet.SearchWorld(nSubWorldID);
  200. lab_subworldid2idx:
  201. Lua_PushNumber(L, nTargetSubWorld);
  202. return 1;
  203. }
  204. /*
  205. Say(sMainInfo, nSelCount, sSel1, sSel2, sSel3, .....,sSeln) 
  206. Say(nMainInfo, nSelCount, sSel1, sSel2, sSel3, .....,sSeln) 
  207. Say(nMainInfo, nSelCount, SelTab)
  208. 如果是客户端的则不会向服务器端发送任何操作
  209.   Say(100, 3, 10, 23,43)
  210.   Say("选择什么?", 2, "是/yes", "否/no");
  211.   Say("选什么呀", 2, SelTab);
  212. */
  213. //**************************************************************************************************************************************************************
  214. // 界面脚本
  215. //**************************************************************************************************************************************************************
  216. int LuaSelectUI(Lua_State * L)
  217. {
  218. char * strMain  = NULL;
  219. int nMainInfo = 0;
  220. int nDataType = 0;
  221. int nOptionNum = 0;
  222. char * pContent = NULL;
  223. int nPlayerIndex = GetPlayerIndex(L);
  224. if (nPlayerIndex < 0) return 0;
  225. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = false;
  226. int nParamNum = Lua_GetTopIndex(L);
  227. if (nParamNum < 2) return 0;
  228. if (Lua_IsNumber(L,2))
  229. {
  230. nOptionNum = (int)Lua_ValueToNumber(L,2);
  231. }
  232. else 
  233. {
  234. _ASSERT(0);
  235. return 0;
  236. }
  237. if  (Lua_IsNumber(L,1))
  238. {
  239. nMainInfo = (int)Lua_ValueToNumber(L,1);
  240. nDataType = 1 ;
  241. }
  242. else if (Lua_IsString(L, 1))  //检查主信息是字符串还是字符串标识号
  243. {
  244. strMain = (char *)Lua_ValueToString(L, 1);
  245. nDataType = 0 ;
  246. }
  247. else
  248. return 0;
  249. BOOL bStringTab = FALSE;//标识传进来的选项数据存放在一个数组中,还是许多字符串里
  250. if (Lua_IsString(L,3))
  251. bStringTab = FALSE;
  252. else if (Lua_IsTable(L, 3))
  253. {
  254. bStringTab = TRUE;
  255. }
  256. else 
  257. {if (nOptionNum > 0)  return 0;
  258. }
  259. if (bStringTab == FALSE)
  260. {
  261. //获得实际传入的选项的个数
  262. if (nOptionNum > nParamNum - 2) nOptionNum = nParamNum - 2;
  263. }
  264. if (nOptionNum > MAX_ANSWERNUM) nOptionNum = MAX_ANSWERNUM;
  265. PLAYER_SCRIPTACTION_SYNC UiInfo;
  266. UiInfo.m_bUIId = UI_SELECTDIALOG;
  267. UiInfo.m_bParam1 = nDataType;//主信息的类型,字符串(0)或数字(1)
  268. UiInfo.m_bOptionNum = nOptionNum;
  269. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  270. //主信息为字符串
  271. if (nDataType == 0)
  272. {
  273. if (strMain)
  274. sprintf(UiInfo.m_pContent, "%s", strMain);
  275. pContent = UiInfo.m_pContent;
  276. }
  277. else if (nDataType == 1) //主信息为数字标识
  278. {
  279. *(int *)UiInfo.m_pContent = nMainInfo;
  280. pContent = UiInfo.m_pContent + sizeof(int);
  281. *pContent = 0;
  282. }
  283. if (nOptionNum > MAX_ANSWERNUM)
  284. nOptionNum = MAX_ANSWERNUM;
  285. Player[nPlayerIndex].m_nAvailableAnswerNum = nOptionNum;
  286. for (int i  = 0; i < nOptionNum; i ++)
  287. {
  288. char  pAnswer[100];
  289. pAnswer[0] = 0;
  290. if (bStringTab)
  291. {
  292. Lua_PushNumber(L, i + 1);
  293. Lua_RawGet(L, 3);
  294. char * pszString = (char *)Lua_ValueToString(L, Lua_GetTopIndex(L));
  295. if (pszString)
  296. {
  297. g_StrCpyLen(pAnswer, pszString, 100);
  298. }
  299. }
  300. else 
  301. {
  302. char * pszString = (char *)Lua_ValueToString(L, i + 3);
  303. if (pszString)
  304. g_StrCpyLen(pAnswer, pszString, 100);
  305. }
  306. char * pFunName = strstr(pAnswer, "/");
  307. if (pFunName)
  308. {
  309. g_StrCpyLen(Player[nPlayerIndex].m_szTaskAnswerFun[i], pFunName + 1, sizeof(Player[nPlayerIndex].m_szTaskAnswerFun[0]));
  310. *pFunName = 0;
  311. sprintf(pContent, "%s|%s", pContent, pAnswer);
  312. }
  313. else 
  314. {
  315. strcpy(Player[nPlayerIndex].m_szTaskAnswerFun[i], "main");
  316. sprintf(pContent, "%s|%s", pContent, pAnswer);
  317. }
  318. }
  319. if (nDataType == 0)
  320. UiInfo.m_nBufferLen  = strlen(pContent);
  321. else 
  322. UiInfo.m_nBufferLen = strlen(pContent) + sizeof(int);
  323. #ifndef _SERVER
  324. UiInfo.m_bParam2 = 0;
  325. #else
  326. UiInfo.m_bParam2 = 1;
  327. #endif
  328. if (nOptionNum == 0)
  329. {
  330. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = false;
  331. }
  332. else
  333. {
  334. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = true;
  335. }
  336. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  337. return 0;
  338. }
  339. //PutMsg(szMsg/MsgId)
  340. int LuaSendMessageInfo(Lua_State * L)
  341. {
  342. if (Lua_GetTopIndex(L) < 1) 
  343. return 0;
  344. int nPlayerIndex = GetPlayerIndex(L);
  345. if (nPlayerIndex < 0) return 0;
  346. PLAYER_SCRIPTACTION_SYNC UiInfo;
  347. UiInfo.m_bUIId = UI_MSGINFO;
  348. UiInfo.m_bOptionNum = 1;
  349. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  350. int nMsgId = 0;
  351. if (Lua_IsNumber(L,1))
  352. {
  353. nMsgId = (int)Lua_ValueToNumber(L,1);
  354. *((int *)(UiInfo.m_pContent)) = nMsgId;
  355. UiInfo.m_bParam1 = 1;
  356. UiInfo.m_nBufferLen = sizeof(int);
  357. }
  358. else 
  359. {
  360. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  361. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent));
  362. UiInfo.m_bParam1 = 0;
  363. }
  364. #ifndef _SERVER
  365. UiInfo.m_bParam2 = 0;
  366. #else
  367. UiInfo.m_bParam2 = 1;
  368. #endif
  369. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  370. return 0;
  371. }
  372. //AddGlobalNews(Newsstr)
  373. int LuaAddGlobalNews(Lua_State * L)
  374. {
  375. if (Lua_GetTopIndex(L) < 1) 
  376. return 0;
  377. PLAYER_SCRIPTACTION_SYNC UiInfo;
  378. UiInfo.m_bUIId = UI_NEWSINFO;
  379. UiInfo.m_bOptionNum = NEWSMESSAGE_NORMAL;
  380. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  381. int nMsgId = 0;
  382. if (Lua_IsNumber(L,1))
  383. {
  384. nMsgId = (int)Lua_ValueToNumber(L,1);
  385. *((int *)(UiInfo.m_pContent)) = nMsgId;
  386. UiInfo.m_bParam1 = 1;
  387. UiInfo.m_nBufferLen = sizeof(int);
  388. }
  389. else 
  390. {
  391. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  392. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent));
  393. UiInfo.m_bParam1 = 0;
  394. }
  395. #ifndef _SERVER
  396. int nPlayerIndex = GetPlayerIndex(L);
  397. if (nPlayerIndex < 0) return 0;
  398. UiInfo.m_bParam2 = 0;
  399. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  400. #else
  401. UiInfo.m_bParam2 = 1;
  402. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  403. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  404. g_NewProtocolProcess.BroadcastGlobal(&UiInfo, UiInfo.m_wProtocolLong + 1);
  405. #endif
  406. return 0;
  407. }
  408. //AddLocalNews(Newsstr)
  409. int LuaAddLocalNews(Lua_State * L)
  410. {
  411. if (Lua_GetTopIndex(L) < 1) 
  412. return 0;
  413. PLAYER_SCRIPTACTION_SYNC UiInfo;
  414. UiInfo.m_bUIId = UI_NEWSINFO;
  415. UiInfo.m_bOptionNum = NEWSMESSAGE_NORMAL;
  416. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  417. int nMsgId = 0;
  418. if (Lua_IsNumber(L,1))
  419. {
  420. nMsgId = (int)Lua_ValueToNumber(L,1);
  421. *((int *)(UiInfo.m_pContent)) = nMsgId;
  422. UiInfo.m_bParam1 = 1;
  423. UiInfo.m_nBufferLen = sizeof(int);
  424. }
  425. else 
  426. {
  427. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  428. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent));
  429. UiInfo.m_bParam1 = 0;
  430. }
  431. #ifndef _SERVER
  432. int nPlayerIndex = GetPlayerIndex(L);
  433. if (nPlayerIndex < 0) return 0;
  434. UiInfo.m_bParam2 = 0;
  435. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  436. #else
  437. UiInfo.m_bParam2 = 1;
  438. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  439. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  440. g_NewProtocolProcess.BroadcastLocalServer(&UiInfo, UiInfo.m_wProtocolLong + 1);
  441. #endif
  442. return 0;
  443. }
  444. //AddGlobalCountNews(strNew/newid, time)
  445. int LuaAddGlobalCountNews(Lua_State * L)
  446. {
  447. if (Lua_GetTopIndex(L) < 2) 
  448. return 0;
  449. PLAYER_SCRIPTACTION_SYNC UiInfo;
  450. UiInfo.m_bUIId = UI_NEWSINFO;
  451. UiInfo.m_bOptionNum = NEWSMESSAGE_COUNTING;
  452. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  453. int nMsgId = 0;
  454. int nTime = (int)Lua_ValueToNumber(L,2);
  455. if (nTime <= 0)
  456. nTime = 1;
  457. if (Lua_IsNumber(L,1))
  458. {
  459. nMsgId = (int)Lua_ValueToNumber(L,1);
  460. *((int *)(UiInfo.m_pContent)) = nMsgId;
  461. UiInfo.m_bParam1 = 1;
  462. *(int *)((char *)UiInfo.m_pContent + sizeof(int)) = nTime;
  463. UiInfo.m_nBufferLen = sizeof(int) * 2;
  464. }
  465. else 
  466. {
  467. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  468. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent));
  469. *(int *)((char *)UiInfo.m_pContent + UiInfo.m_nBufferLen) = nTime;
  470. UiInfo.m_nBufferLen += sizeof(int);
  471. UiInfo.m_bParam1 = 0;
  472. }
  473. #ifndef _SERVER
  474. int nPlayerIndex = GetPlayerIndex(L);
  475. if (nPlayerIndex < 0) return 0;
  476. UiInfo.m_bParam2 = 0;
  477. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  478. #else
  479. UiInfo.m_bParam2 = 1;
  480. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  481. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  482. g_NewProtocolProcess.BroadcastGlobal(&UiInfo, UiInfo.m_wProtocolLong + 1);
  483. #endif
  484. return 0;
  485. }
  486. //AddLocalCountNews(strNew/newid, time)
  487. int LuaAddLocalCountNews(Lua_State * L)
  488. {
  489. if (Lua_GetTopIndex(L) < 2) 
  490. return 0;
  491. PLAYER_SCRIPTACTION_SYNC UiInfo;
  492. UiInfo.m_bUIId = UI_NEWSINFO;
  493. UiInfo.m_bOptionNum = NEWSMESSAGE_COUNTING;
  494. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  495. int nMsgId = 0;
  496. int nTime = (int)Lua_ValueToNumber(L,2);
  497. if (nTime <= 0)
  498. nTime = 1;
  499. if (Lua_IsNumber(L,1))
  500. {
  501. nMsgId = (int)Lua_ValueToNumber(L,1);
  502. *((int *)(UiInfo.m_pContent)) = nMsgId;
  503. UiInfo.m_bParam1 = 1;
  504. *(int *)((char *)UiInfo.m_pContent + sizeof(int)) = nTime;
  505. UiInfo.m_nBufferLen = sizeof(int) * 2;
  506. }
  507. else 
  508. {
  509. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  510. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent));
  511. *(int *)((char *)UiInfo.m_pContent + UiInfo.m_nBufferLen) = nTime;
  512. UiInfo.m_nBufferLen += sizeof(int);
  513. UiInfo.m_bParam1 = 0;
  514. }
  515. #ifndef _SERVER
  516. int nPlayerIndex = GetPlayerIndex(L);
  517. if (nPlayerIndex < 0) return 0;
  518. UiInfo.m_bParam2 = 0;
  519. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  520. #else
  521. UiInfo.m_bParam2 = 1;
  522. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  523. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  524. g_NewProtocolProcess.BroadcastLocalServer(&UiInfo, UiInfo.m_wProtocolLong + 1);
  525. #endif
  526. return 0;
  527. }
  528. //AddGlobalTimeNews(strNew/newid, year,month,day,hour,mins)
  529. int LuaAddGlobalTimeNews(Lua_State * L)
  530. {
  531. if (Lua_GetTopIndex(L) < 6) 
  532. return 0;
  533. PLAYER_SCRIPTACTION_SYNC UiInfo;
  534. UiInfo.m_bUIId = UI_NEWSINFO;
  535. UiInfo.m_bOptionNum = NEWSMESSAGE_TIMEEND;
  536. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  537. int nMsgId = 0;
  538. if (Lua_IsNumber(L,1))
  539. {
  540. nMsgId = (int)Lua_ValueToNumber(L,1);
  541. *((int *)(UiInfo.m_pContent)) = nMsgId;
  542. UiInfo.m_bParam1 = 1;
  543. UiInfo.m_nBufferLen = sizeof(int) + sizeof(SYSTEMTIME);
  544. }
  545. else 
  546. {
  547. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  548. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent)) + sizeof(SYSTEMTIME);
  549. UiInfo.m_bParam1 = 0;
  550. }
  551. SYSTEMTIME *pSystemTime =  (SYSTEMTIME *)((char *)UiInfo.m_pContent + UiInfo.m_nBufferLen - sizeof(SYSTEMTIME));
  552. memset(pSystemTime, 0, sizeof(SYSTEMTIME));
  553. SYSTEMTIME LocalTime ;
  554. memset(&LocalTime, 0, sizeof(SYSTEMTIME));
  555. LocalTime.wYear = (WORD)Lua_ValueToNumber(L,2);
  556. LocalTime.wMonth =(WORD)Lua_ValueToNumber(L,3);
  557. LocalTime.wDay = (WORD)Lua_ValueToNumber(L, 4);
  558. LocalTime.wHour = (WORD)Lua_ValueToNumber(L,5);
  559. LocalTime.wMinute = (WORD)Lua_ValueToNumber(L,6);
  560. FILETIME ft;
  561. FILETIME sysft;
  562. #ifdef WIN32
  563. SystemTimeToFileTime(&LocalTime, &ft);
  564. LocalFileTimeToFileTime(&ft, &sysft);
  565. FileTimeToSystemTime(&sysft, pSystemTime);
  566. #else
  567. memcpy(pSystemTime, &LocalTime, sizeof(LocalTime));
  568. #endif
  569. #ifndef _SERVER
  570. int nPlayerIndex = GetPlayerIndex(L);
  571. if (nPlayerIndex < 0) return 0;
  572. UiInfo.m_bParam2 = 0;
  573. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  574. #else
  575. UiInfo.m_bParam2 = 1;
  576. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  577. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  578. g_NewProtocolProcess.BroadcastGlobal(&UiInfo, UiInfo.m_wProtocolLong + 1);
  579. #endif
  580. return 0;
  581. }
  582. //AddLocalTimeNews(strNew/newid, year,month,day,hour,mins)
  583. int LuaAddLocalTimeNews(Lua_State * L)
  584. {
  585. if (Lua_GetTopIndex(L) < 6) 
  586. return 0;
  587. PLAYER_SCRIPTACTION_SYNC UiInfo;
  588. UiInfo.m_bUIId = UI_NEWSINFO;
  589. UiInfo.m_bOptionNum = NEWSMESSAGE_TIMEEND;
  590. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  591. int nMsgId = 0;
  592. if (Lua_IsNumber(L,1))
  593. {
  594. nMsgId = (int)Lua_ValueToNumber(L,1);
  595. *((int *)(UiInfo.m_pContent)) = nMsgId;
  596. UiInfo.m_bParam1 = 1;
  597. UiInfo.m_nBufferLen = sizeof(int) + sizeof(SYSTEMTIME);
  598. }
  599. else 
  600. {
  601. g_StrCpyLen(UiInfo.m_pContent, Lua_ValueToString(L,1), 64);
  602. UiInfo.m_nBufferLen = strlen(((char *)UiInfo.m_pContent)) + sizeof(SYSTEMTIME);
  603. UiInfo.m_bParam1 = 0;
  604. }
  605. SYSTEMTIME *pSystemTime =  (SYSTEMTIME *)((char *)UiInfo.m_pContent + UiInfo.m_nBufferLen - sizeof(SYSTEMTIME));
  606. memset(pSystemTime, 0, sizeof(SYSTEMTIME));
  607. SYSTEMTIME LocalTime ;
  608. memset(&LocalTime, 0, sizeof(SYSTEMTIME));
  609. LocalTime.wYear = (WORD)Lua_ValueToNumber(L,2);
  610. LocalTime.wMonth =(WORD)Lua_ValueToNumber(L,3);
  611. LocalTime.wDay = (WORD)Lua_ValueToNumber(L, 4);
  612. LocalTime.wHour = (WORD)Lua_ValueToNumber(L,5);
  613. LocalTime.wMinute = (WORD)Lua_ValueToNumber(L,6);
  614. FILETIME ft;
  615. FILETIME sysft;
  616. #ifdef WIN32
  617. SystemTimeToFileTime(&LocalTime, &ft);
  618. LocalFileTimeToFileTime(&ft, &sysft);
  619. FileTimeToSystemTime(&sysft, pSystemTime);
  620. #else
  621. memcpy(pSystemTime, &LocalTime, sizeof(LocalTime));
  622. #endif
  623. #ifndef _SERVER
  624. int nPlayerIndex = GetPlayerIndex(L);
  625. if (nPlayerIndex < 0) return 0;
  626. UiInfo.m_bParam2 = 0;
  627. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  628. #else
  629. UiInfo.m_bParam2 = 1;
  630. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  631. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  632. g_NewProtocolProcess.BroadcastLocalServer(&UiInfo, UiInfo.m_wProtocolLong + 1);
  633. #endif
  634. return 0;
  635. }
  636. //AddNote(str/strid)
  637. int LuaAddNote(Lua_State * L)
  638. {
  639. char * strMain  = NULL;
  640. int nMainInfo = 0;
  641. int nDataType = 0;
  642. int nPlayerIndex = GetPlayerIndex(L);
  643. if (nPlayerIndex < 0)
  644. return 0;
  645. int nParamNum = Lua_GetTopIndex(L);
  646. if (nParamNum < 1) 
  647. return 0;
  648. int nParam2 = 0;
  649. if  (Lua_IsNumber(L,1))
  650. {
  651. nMainInfo = (int)Lua_ValueToNumber(L,1);
  652. nDataType = 1 ;
  653. }
  654. else if (Lua_IsString(L, 1))  //检查主信息是字符串还是字符串标识号
  655. {
  656. strMain = (char *)Lua_ValueToString(L, 1);
  657. nDataType = 0 ;
  658. }
  659. else
  660. return 0;
  661. if (nParamNum > 1)
  662. {
  663. nParam2 = (int)Lua_ValueToNumber(L, 2);
  664. }
  665. PLAYER_SCRIPTACTION_SYNC UiInfo;
  666. UiInfo.m_bUIId = UI_NOTEINFO;
  667. UiInfo.m_bParam1 = nDataType;//主信息的类型,字符串(0)或数字(1)
  668. #ifndef _SERVER
  669. UiInfo.m_bParam2 = 0;
  670. #else
  671. UiInfo.m_bParam2 = 1;
  672. #endif
  673. UiInfo.m_bOptionNum = 0;
  674. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  675. //主信息为字符串
  676. if (nDataType == 0)
  677. {
  678. if (strMain)
  679. sprintf(UiInfo.m_pContent, "%s", strMain);
  680. int nLen = strlen(strMain);
  681. *(int*)(UiInfo.m_pContent + nLen) = nParam2;
  682. UiInfo.m_nBufferLen = nLen + sizeof(int);
  683. }
  684. else if (nDataType == 1) //主信息为数字标识
  685. {
  686. *(int *)UiInfo.m_pContent = nMainInfo;
  687. *(int *)(UiInfo.m_pContent + sizeof(int)) = nParam2;
  688. UiInfo.m_nBufferLen = sizeof(int) + sizeof(int);
  689. }
  690. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  691. return 0;
  692. }
  693. /*
  694. **
  695. **格式1:Talk(SentenceNum, CallBack-Fun(结束后的回调函数), sTalk1, sTalk2, sTalk3, sTalk4,...sTalkN);  
  696. Talk(SentenceNum, CallBack-Fun(结束后的回调函数), nTalk1, nTalk2,nTalk3,nTalk4,...nTalkN);  
  697. **格式2:Talk(SentenceNum, CallBack-Fun, SentenceTab);
  698. **例子:Talk(3,"EndTalk", "玩家:请问现在几点钟了?", "雇员:现在5点钟了","太谢谢你了!");
  699. **
  700. */
  701. int LuaTalkUI(Lua_State * L)
  702. {
  703. int nPlayerIndex = GetPlayerIndex(L);
  704. if (nPlayerIndex <= 0) 
  705. return 0;
  706. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = false;
  707. int nMainInfo = 0;
  708. int nDataType = 0;
  709. int nOptionNum = 0;
  710. char * pContent = NULL;
  711. int nParamNum = Lua_GetTopIndex(L);
  712. if (nParamNum < 3) 
  713. return 0;
  714. if (Lua_IsNumber(L,1))
  715. {
  716. nOptionNum = (int)Lua_ValueToNumber(L,1);
  717. }
  718. else 
  719. {
  720. _ASSERT(0);
  721. return 0;
  722. }
  723. const char * pCallBackFun = Lua_ValueToString(L,2);
  724. //检查主信息是字符串还是字符串标识号
  725. if  (Lua_IsNumber(L,3))
  726. {
  727. nDataType = 1 ;
  728. }
  729. else if (Lua_IsString(L, 3)) 
  730. {
  731. nDataType = 0 ;
  732. }
  733. else
  734. return 0;
  735. //获得实际传入的选项的个数
  736. if (nOptionNum > nParamNum - 2) 
  737. nOptionNum = nParamNum - 2;
  738. PLAYER_SCRIPTACTION_SYNC UiInfo;
  739. UiInfo.m_bUIId = UI_TALKDIALOG;
  740. UiInfo.m_bParam1 = nDataType;//主信息的类型,字符串(0)或数字(1)
  741. UiInfo.m_bOptionNum = nOptionNum;
  742. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  743. pContent = UiInfo.m_pContent;
  744. pContent[0] = 0;
  745. size_t nContentLen = 0;
  746. for (int i  = 0; i < nOptionNum; i ++)
  747. {
  748. const char * pString = NULL;
  749. if (!nDataType)//StringInfo
  750. {
  751. pString = Lua_ValueToString(L, i + 3);
  752. if (nContentLen  + strlen(pString) >= MAX_SCIRPTACTION_BUFFERNUM)
  753. {
  754. nOptionNum = i;
  755. UiInfo.m_bOptionNum = nOptionNum;
  756. break;
  757. }
  758. nContentLen += strlen(pString);
  759. sprintf(pContent, "%s%s|", pContent, pString);
  760. }
  761. else
  762. {
  763. int j = (int)Lua_ValueToNumber(L, i + 3);
  764. sprintf(pContent, "%s%d|", pContent, j);
  765. }
  766. }
  767. UiInfo.m_nBufferLen  = strlen(pContent);
  768. if (!pCallBackFun || strlen(pCallBackFun) <= 0)
  769. {
  770. UiInfo.m_nParam = 0;
  771. Player[nPlayerIndex].m_nAvailableAnswerNum = 0;
  772. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = false;
  773. }
  774. else
  775. {
  776. UiInfo.m_nParam = 1;
  777. Player[nPlayerIndex].m_nAvailableAnswerNum = 1;
  778. g_StrCpyLen(Player[nPlayerIndex].m_szTaskAnswerFun[0], pCallBackFun, sizeof(Player[nPlayerIndex].m_szTaskAnswerFun[0]));
  779. Player[nPlayerIndex].m_bWaitingPlayerFeedBack = true;
  780. }
  781. #ifndef _SERVER
  782. UiInfo.m_bParam2 = 0;
  783. #else
  784. UiInfo.m_bParam2 = 1;
  785. #endif
  786. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  787. return 0;
  788. }
  789. int LuaIncludeFile(Lua_State * L)
  790. {
  791. if (Lua_GetTopIndex(L) <= 0) return 0;
  792. if (Lua_IsString(L,1))
  793. {
  794. const char * pFileName = lua_tostring(L,1);
  795. char lszCurrentDirectory[MAX_PATH];
  796. int nLen = 0;
  797. if (pFileName[0] != '\' && pFileName[0] != '/')
  798. {
  799. getcwd(lszCurrentDirectory, MAX_PATH);
  800. nLen = strlen(lszCurrentDirectory);
  801. if (lszCurrentDirectory[nLen - 1] == '\' || lszCurrentDirectory[nLen - 1] == '/')
  802. lszCurrentDirectory[nLen - 1] = 0;
  803. #ifdef WIN32
  804. g_StrCat(lszCurrentDirectory, "\");
  805. g_StrCat(lszCurrentDirectory, (char*)pFileName);
  806. #else
  807. g_StrCat(lszCurrentDirectory, "/");
  808. g_StrCat(lszCurrentDirectory, (char*)pFileName);
  809. for (int i = 0; lszCurrentDirectory[i]; i++)
  810. {
  811. if (lszCurrentDirectory[i] == '\')
  812. lszCurrentDirectory[i] = '/';
  813. }
  814. #endif
  815. }
  816. else
  817. {
  818. g_GetRootPath(lszCurrentDirectory);
  819. nLen = strlen(lszCurrentDirectory);
  820. if (lszCurrentDirectory[nLen - 1] == '\' || lszCurrentDirectory[nLen - 1] == '/')
  821. lszCurrentDirectory[nLen - 1] = 0;
  822. #ifdef WIN32
  823. g_StrCat(lszCurrentDirectory, "\");
  824. g_StrCat(lszCurrentDirectory, (char*)pFileName + 1);
  825. #else
  826. g_StrCat(lszCurrentDirectory, "/");
  827. g_StrCat(lszCurrentDirectory, (char*)pFileName + 1);
  828. for (int i = 0; lszCurrentDirectory[i]; i++)
  829. {
  830. if (lszCurrentDirectory[i] == '\')
  831. lszCurrentDirectory[i] = '/';
  832. }
  833. #endif
  834. }
  835. strlwr(lszCurrentDirectory + nLen);
  836. lua_dofile(L, lszCurrentDirectory);
  837. return 0;
  838. }
  839. else
  840. return 0;
  841. }
  842. //**************************************************************************************************************************************************************
  843. // 任务脚本
  844. //**************************************************************************************************************************************************************
  845. int LuaGetTaskValue(Lua_State * L)
  846. {
  847. int nPlayerIndex = GetPlayerIndex(L);
  848. if (nPlayerIndex > 0) 
  849. {
  850. int nValue = (int)Player[nPlayerIndex].m_cTask.GetSaveVal((int)Lua_ValueToNumber(L,1));
  851. Lua_PushNumber(L, nValue);
  852. }
  853. else
  854. Lua_PushNil(L);
  855. return 1;
  856. }
  857. int LuaSetTaskValue(Lua_State * L)
  858. {
  859. int nPlayerIndex = GetPlayerIndex(L);
  860. int nValueIndex = (int)Lua_ValueToNumber(L, 1);
  861. int nValue = (int)Lua_ValueToNumber(L, 2);
  862. if (nPlayerIndex <= 0) return 0;
  863. Player[nPlayerIndex].m_cTask.SetSaveVal(nValueIndex, nValue);
  864. return 0;
  865. }
  866. #ifndef _SERVER
  867. #define MAX_TEMPVALUENUM_INCLIENT 500
  868. int g_TempValue[MAX_TEMPVALUENUM_INCLIENT];
  869. #endif
  870. int LuaGetTempTaskValue(Lua_State * L)
  871. {
  872. int nTempIndex = (int)Lua_ValueToNumber(L, Lua_GetTopIndex(L));
  873. #ifdef _SERVER
  874. if(nTempIndex >= MAX_TEMP_TASK)
  875. {
  876. Lua_PushNil(L) ;
  877. return 1;
  878. }
  879. int nPlayerIndex = GetPlayerIndex(L);
  880. if (nPlayerIndex <= 0) 
  881. {
  882. Lua_PushNil(L);
  883. return 1;
  884. }
  885. int nValue = Player[nPlayerIndex].m_cTask.GetClearVal(nTempIndex);
  886. Lua_PushNumber(L, nValue);
  887. #else
  888. if (nTempIndex >= 0 && nTempIndex < MAX_TEMPVALUENUM_INCLIENT)
  889. Lua_PushNumber(L, g_TempValue[nTempIndex]);
  890. else 
  891. Lua_PushNil(L);
  892. #endif
  893. return 1;
  894. }
  895. int LuaSetTempTaskValue(Lua_State * L)
  896. {
  897. int nTempIndex = (int)Lua_ValueToNumber(L, Lua_GetTopIndex(L) - 1);
  898. int nValue = (int)Lua_ValueToNumber(L, Lua_GetTopIndex(L));
  899. #ifdef _SERVER
  900. Lua_GetGlobal(L, SCRIPT_PLAYERINDEX);
  901. int nPlayerIndex = (int)Lua_ValueToNumber(L, Lua_GetTopIndex(L));
  902. if (nPlayerIndex <= 0) return 0;
  903. Player[nPlayerIndex].m_cTask.SetClearVal(nTempIndex, nValue);
  904. #else
  905. g_TempValue[nTempIndex] = nValue;
  906. #endif
  907. return 0;
  908. }
  909. #ifdef _SERVER
  910. //---------------------------------交易、买卖、打开储藏箱-----------------------
  911. //Sale(id)
  912. //------------------------------------------------------------------------------
  913. int LuaSale(Lua_State * L)
  914. {
  915. if (Lua_GetTopIndex(L) <= 0) return 0;
  916. int nPlayerIndex = GetPlayerIndex(L);
  917. if (nPlayerIndex > 0)
  918. {
  919. int nShopId = (int)Lua_ValueToNumber(L,1);
  920. //----在以下加入买卖的实际代码!
  921. BuySell.OpenSale(nPlayerIndex, nShopId - 1);
  922. }
  923. return 0;
  924. }
  925. int LuaTrade(Lua_State * L)
  926. {
  927. //Question 未写
  928. return 0;
  929. }
  930. int LuaOpenBox(Lua_State * L)
  931. {
  932. int nPlayerIndex = GetPlayerIndex(L);
  933. if (nPlayerIndex <= 0) return 0;
  934. BYTE NetCommand = (BYTE)s2c_openstorebox;
  935. g_pServer->PackDataToClient(Player[nPlayerIndex].m_nNetConnectIdx, &NetCommand, sizeof(BYTE));
  936. return 0;
  937. }
  938. //---------------------------------时间任务-------------------------------------
  939. //SetTimer(Time, TimerTaskId)
  940. int LuaSetTimer(Lua_State  * L)
  941. {
  942. int nParamCount = Lua_GetTopIndex(L);
  943. if (nParamCount < 2 ) return 0;
  944. int nPlayerIndex  = GetPlayerIndex(L);
  945. if (nPlayerIndex <= 0) return 0;
  946. Player[nPlayerIndex].SetTimer((DWORD) (int)Lua_ValueToNumber(L, 1), (int)Lua_ValueToNumber(L,2));
  947. return 0;
  948. }
  949. int LuaStopTimer(Lua_State * L)
  950. {
  951. int nPlayerIndex  = GetPlayerIndex(L);
  952. if (nPlayerIndex <= 0) return 0;
  953. Player[nPlayerIndex].CloseTimer();
  954. return 0;
  955. }
  956. int LuaGetCurTimerId(Lua_State * L)
  957. {
  958. int nPlayerIndex  = GetPlayerIndex(L);
  959. if (nPlayerIndex <= 0) 
  960. {
  961. Lua_PushNumber(L,0);
  962. return 1;
  963. }
  964. int nTimerId = Player[nPlayerIndex].m_TimerTask.GetTaskId();
  965. Lua_PushNumber(L, nTimerId);
  966. return 1;
  967. }
  968. int LuaGetRestTime(Lua_State * L)
  969. {
  970. int nPlayerIndex  = GetPlayerIndex(L);
  971. if (nPlayerIndex <= 0) 
  972. {
  973. Lua_PushNil(L);
  974. return 1;
  975. }
  976. int nRestTime = Player[nPlayerIndex].m_TimerTask.GetRestTime();//m_dwTimeTaskTime - g_SubWorldSet.GetGameTime();
  977. if (nRestTime > 0)
  978. Lua_PushNumber(L, nRestTime);
  979. else
  980. Lua_PushNumber(L, 0);
  981. return 1;
  982. }
  983. int LuaGetMissionRestTime(Lua_State * L)
  984. {
  985. int RestTime = 0;
  986. if (Lua_GetTopIndex(L) >= 2)
  987. {
  988. int nSubWorldIndex = GetSubWorldIndex(L);
  989. if (nSubWorldIndex >= 0) 
  990. {
  991. int nMissionId = (int)Lua_ValueToNumber(L, 1);
  992. int nTimerId = (int)Lua_ValueToNumber(L, 2);
  993. if (nMissionId < 0 || nTimerId < 0 )
  994. goto lab_getmissionresttime;
  995. KMission Mission;
  996. Mission.SetMissionId(nMissionId);
  997. KMission * pMission = SubWorld[nSubWorldIndex].m_MissionArray.GetData(&Mission);
  998. if (pMission)
  999. {
  1000. RestTime = (int)pMission->GetTimerRestTimer(nTimerId);
  1001. }
  1002. }
  1003. }
  1004. lab_getmissionresttime:
  1005. Lua_PushNumber(L, RestTime);
  1006. return 1;
  1007. }
  1008. //**************************************************************************************************************************************************************
  1009. // 组队脚本
  1010. //**************************************************************************************************************************************************************
  1011. int LuaIsLeader(Lua_State * L)
  1012. {
  1013. int nPlayerIndex = GetPlayerIndex(L);
  1014. if (nPlayerIndex > 0 ) 
  1015. {
  1016. if (Player[nPlayerIndex].m_cTeam.m_nFlag && Player[nPlayerIndex].m_cTeam.m_nFigure == TEAM_CAPTAIN)
  1017. Lua_PushNumber(L,1);
  1018. else 
  1019. Lua_PushNumber(L,0);
  1020. }
  1021. else 
  1022. Lua_PushNumber(L, 0);
  1023. return 1;
  1024. }
  1025. int LuaGetTeamId(Lua_State * L)
  1026. {
  1027. int nPlayerIndex = GetPlayerIndex(L);
  1028. if (nPlayerIndex > 0)
  1029. {
  1030. if (Player[nPlayerIndex].m_cTeam.m_nFlag)
  1031. Lua_PushNumber(L, Player[nPlayerIndex].m_cTeam.m_nID);
  1032. else Lua_PushNil(L);
  1033. }
  1034. else 
  1035. Lua_PushNil(L);
  1036. return 1;
  1037. }
  1038. int LuaGetTeamSize(Lua_State * L)
  1039. {
  1040. int nTeamSize = 0;
  1041. int nTeamId = -1;
  1042. if (Lua_GetTopIndex(L) >= 1)
  1043. {
  1044. nTeamId = Lua_ValueToNumber(L, 1);
  1045. }
  1046. else
  1047. {
  1048. int nPlayerIndex = GetPlayerIndex(L);
  1049. if (nPlayerIndex > 0)
  1050. {
  1051. if (Player[nPlayerIndex].m_cTeam.m_nFlag)
  1052. nTeamId = Player[nPlayerIndex].m_cTeam.m_nID;
  1053. else 
  1054. nTeamId = -1;
  1055. }
  1056. }
  1057. if (nTeamId < 0)
  1058. nTeamSize = 0;
  1059. else
  1060. nTeamSize = g_Team[nTeamId].m_nMemNum + 1;
  1061. Lua_PushNumber(L, nTeamSize);
  1062. return 1;
  1063. }
  1064. int LuaLeaveTeam(Lua_State * L)
  1065. {
  1066. int nPlayerIndex = GetPlayerIndex(L);
  1067. if (nPlayerIndex > 0)
  1068. {
  1069. if (Player[nPlayerIndex].m_cTeam.m_nFlag)
  1070. {
  1071. PLAYER_APPLY_LEAVE_TEAM sLeaveTeam;
  1072. sLeaveTeam.ProtocolType = c2s_teamapplyleave;
  1073. Player[nPlayerIndex].LeaveTeam((BYTE*)&sLeaveTeam);
  1074. }
  1075. }
  1076. return 0;
  1077. }
  1078. int LuaSetCreateTeamOption(Lua_State * L)
  1079. {
  1080. int nState = (int)Lua_ValueToNumber(L, 1);
  1081. int nPlayerIndex = GetPlayerIndex(L);
  1082. if (nPlayerIndex > 0)
  1083. {
  1084. if (nState)
  1085. Player[nPlayerIndex].m_cTeam.SetCanTeamFlag(nPlayerIndex, TRUE);
  1086. else
  1087. Player[nPlayerIndex].m_cTeam.SetCanTeamFlag(nPlayerIndex, FALSE);
  1088. }
  1089. return 0;
  1090. }
  1091. //**************************************************************************************************************************************************************
  1092. // 聊天消息脚本
  1093. //**************************************************************************************************************************************************************
  1094. int LuaMsgToPlayer(Lua_State * L)
  1095. {
  1096. if (Lua_GetTopIndex(L) <= 0) return 0;
  1097. int nPlayerIndex = GetPlayerIndex(L);
  1098. if (nPlayerIndex > 0) 
  1099. {
  1100. const char *  szMsg = Lua_ValueToString(L,1);
  1101. if (szMsg)
  1102. KPlayerChat::SendSystemInfo(1, nPlayerIndex, MESSAGE_SYSTEM_ANNOUCE_HEAD, (char *) szMsg, strlen(szMsg) );
  1103. }
  1104. return 0;
  1105. }
  1106. int LuaMsgToTeam(Lua_State * L)
  1107. {
  1108. if (Lua_GetTopIndex(L) <= 0 ) return 0;
  1109. int nPlayerIndex = GetPlayerIndex(L);
  1110. if (nPlayerIndex > 0)
  1111. {
  1112. if (Player[nPlayerIndex].m_cTeam.m_nID >= 0)
  1113. {
  1114. const char * szMsg = Lua_ValueToString(L,1);
  1115. int nTeamLeaderId = g_Team[Player[nPlayerIndex].m_cTeam.m_nID].m_nCaptain;
  1116. if (nTeamLeaderId > 0)
  1117. KPlayerChat::SendSystemInfo(1, nTeamLeaderId, "组队消息",(char *) szMsg, strlen(szMsg) );
  1118. for (int i = 0; i < MAX_TEAM_MEMBER; i ++)
  1119. {
  1120. int nMemberId = g_Team[Player[nPlayerIndex].m_cTeam.m_nID].m_nMember[i] ;
  1121. if (nMemberId > 0)
  1122. {
  1123. if (szMsg)
  1124. KPlayerChat::SendSystemInfo(1, nMemberId, "组队消息", (char *)szMsg, strlen(szMsg) );
  1125. }
  1126. }
  1127. }
  1128. }
  1129. return 0;
  1130. }
  1131. int LuaMsgToSubWorld(Lua_State * L)
  1132. {
  1133. if (Lua_GetTopIndex(L) <= 0 ) return 0;
  1134. const char * szMsg = Lua_ValueToString(L,1);
  1135. if (szMsg)
  1136. KPlayerChat::SendSystemInfo(0, 0, MESSAGE_SYSTEM_ANNOUCE_HEAD, (char *)szMsg, strlen(szMsg) );
  1137. return 0;
  1138. }
  1139. int LuaMsgToAroundRegion(Lua_State * L)
  1140. {
  1141. return 0;
  1142. }
  1143. //**************************************************************************************************************************************************************
  1144. // 主角脚本
  1145. //**************************************************************************************************************************************************************
  1146. //**************************************************************************************************************************************************************
  1147. // 主角脚本
  1148. //**************************************************************************************************************************************************************
  1149. /*功能:让玩家进入新的一个游戏世界
  1150. nPlayerIndex:主角的Index
  1151. nSubWorldIndex:游戏世界id
  1152. nPosX:
  1153. nPosY:
  1154. */
  1155. //NewWorld(WorldId, X,Y)
  1156. int  LuaEnterNewWorld(Lua_State * L) 
  1157. {
  1158. int nPlayerIndex = GetPlayerIndex(L);
  1159. if (nPlayerIndex < 0) 
  1160. return 0;
  1161. int nResult = 0;
  1162. if (Lua_GetTopIndex(L) >= 3)
  1163. {
  1164. DWORD dwWorldId = (DWORD)Lua_ValueToNumber(L, 1);
  1165. nResult = Npc[Player[nPlayerIndex].m_nIndex].ChangeWorld(dwWorldId, (int)Lua_ValueToNumber(L,2) * 32, (int)Lua_ValueToNumber(L,3) * 32);
  1166. }
  1167. Lua_PushNumber(L, nResult);
  1168. return 1;
  1169. }
  1170. //SetPos(X,Y)
  1171. int LuaSetPos(Lua_State * L)
  1172. {
  1173. int nParamCount = Lua_GetTopIndex(L);
  1174. if (nParamCount != 2) return 0;
  1175. int nPlayerIndex = GetPlayerIndex(L);
  1176. int nX = (int) Lua_ValueToNumber(L,1);
  1177. int nY = (int) Lua_ValueToNumber(L,2);
  1178. if (nPlayerIndex > 0)
  1179. {
  1180. Npc[Player[nPlayerIndex].m_nIndex].SetPos(nX * 32, nY * 32);
  1181. }
  1182. return 0;
  1183. }
  1184. int LuaGetPos(Lua_State * L)
  1185. {
  1186. int nPlayerIndex = GetPlayerIndex(L);
  1187. if (nPlayerIndex > 0)
  1188. {
  1189. int nPosX = 0;
  1190. int nPosY = 0;
  1191. Npc[Player[nPlayerIndex].m_nIndex].GetMpsPos(&nPosX, &nPosY);
  1192. Lua_PushNumber(L, nPosX);
  1193. Lua_PushNumber(L, nPosY);
  1194. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_SubWorldIndex); 
  1195. }
  1196. else
  1197. return 0;
  1198. return 3;
  1199. }
  1200. //W,X,Y = GetWorldPos()
  1201. int LuaGetNewWorldPos(Lua_State * L)
  1202. {
  1203. int nPlayerIndex = GetPlayerIndex(L);
  1204. if (nPlayerIndex > 0)
  1205. {
  1206. int nPosX = 0;
  1207. int nPosY = 0;
  1208. Npc[Player[nPlayerIndex].m_nIndex].GetMpsPos(&nPosX, &nPosY);
  1209. int nSubWorldIndex = Npc[Player[nPlayerIndex].m_nIndex].m_SubWorldIndex;
  1210. int nSubWorldID = 0;
  1211. if (nSubWorldIndex >= 0 && nSubWorldIndex < MAX_SUBWORLD)
  1212. {
  1213. nSubWorldID = SubWorld[nSubWorldIndex].m_SubWorldID;
  1214. }
  1215. Lua_PushNumber(L, nSubWorldID); 
  1216. Lua_PushNumber(L, ((int)(nPosX / 32)));
  1217. Lua_PushNumber(L, ((int)(nPosY / 32)));
  1218. }
  1219. else
  1220. {
  1221. Lua_PushNumber(L, 0);
  1222. Lua_PushNumber(L, 0);
  1223. Lua_PushNumber(L, 0);
  1224. return 3;
  1225. }
  1226. return 3;
  1227. }
  1228. int LuaDropItem(Lua_State *L)
  1229. {
  1230. return 0;
  1231. }
  1232. /*AddEventItem(id)*/
  1233. KTabFile g_EventItemTab;
  1234. int LuaAddEventItem(Lua_State *L)
  1235. {
  1236. // modify by spe 03/06/13
  1237. if (Lua_GetTopIndex(L) < 1)
  1238. return 0;
  1239. int nPlayerIndex = GetPlayerIndex(L);
  1240. if (nPlayerIndex <= 0)
  1241. {
  1242. Lua_PushNumber(L,0);
  1243. return 1;
  1244. }
  1245. int nEventId = 0;
  1246. if (Lua_IsNumber(L, 1))
  1247. {
  1248. nEventId = (int)Lua_ValueToNumber(L,1);
  1249. }
  1250. else
  1251. {
  1252. char * szEventItm = (char *)Lua_ValueToString(L,1);
  1253. if (!g_EventItemTab.GetInteger(szEventItm, "具体类别", 0, &nEventId))
  1254. {
  1255. Lua_PushNumber(L,0);
  1256. return 1;
  1257. }
  1258. }
  1259. int nIndex = ItemSet.Add(item_task, 0, 0, 0, nEventId, 0, 0, 1, 0);
  1260. if (nIndex <= 0) 
  1261. {
  1262. Lua_PushNumber(L,0);
  1263. return 1;
  1264. }
  1265. int x, y;
  1266. if (Player[nPlayerIndex].m_ItemList.CheckCanPlaceInEquipment(Item[nIndex].GetWidth(), Item[nIndex].GetHeight(), &x, &y))
  1267. {
  1268. Player[nPlayerIndex].m_ItemList.Add(nIndex, pos_equiproom, x, y);
  1269. }
  1270. else
  1271. {
  1272. int nIdx = Player[nPlayerIndex].m_ItemList.Hand();
  1273. if (nIdx)
  1274. {
  1275. Player[nPlayerIndex].m_ItemList.Remove(nIdx);
  1276. KMapPos sMapPos;
  1277. KObjItemInfo sInfo;
  1278. Player[nPlayerIndex].GetAboutPos(&sMapPos);
  1279. sInfo.m_nItemID = nIdx;
  1280. sInfo.m_nItemWidth = Item[nIdx].GetWidth();
  1281. sInfo.m_nItemHeight = Item[nIdx].GetHeight();
  1282. sInfo.m_nMoneyNum = 0;
  1283. strcpy(sInfo.m_szName, Item[nIdx].GetName());
  1284. sInfo.m_nColorID = 0;
  1285. sInfo.m_nMovieFlag = 1;
  1286. sInfo.m_nSoundFlag = 1;
  1287. int nObj = ObjSet.Add(Item[nIdx].GetObjIdx(), sMapPos, sInfo);
  1288. if (nObj >= 0)
  1289. {
  1290. if (Item[nIdx].GetGenre() == item_task)
  1291. {
  1292. Object[nObj].SetEntireBelong(nPlayerIndex);
  1293. }
  1294. else
  1295. {
  1296. Object[nObj].SetItemBelong(nPlayerIndex);
  1297. }
  1298. }
  1299. }
  1300. Player[nPlayerIndex].m_ItemList.Add(nIndex, pos_hand, 0 ,0);
  1301. }
  1302. Lua_PushNumber(L, 1);
  1303. return 1;
  1304. }
  1305. /*AddItem(nItemClass, nDetailType, nParticualrType, nLevel, nSeries, nLuck, nItemLevel..6)*/
  1306. int LuaAddItem(Lua_State * L)
  1307. {
  1308. int nPlayerIndex = GetPlayerIndex(L);
  1309. if (nPlayerIndex <= 0)
  1310. {
  1311. Lua_PushNumber(L,0);
  1312. return 1;
  1313. }
  1314. int nParamNum = Lua_GetTopIndex(L);
  1315. if (nParamNum < 7)
  1316. {
  1317. g_DebugLog("[Script]使用AddItem参数数量不符!");
  1318. Lua_PushNumber(L,0);
  1319. return 1;
  1320. }
  1321. int nItemClass = (int)Lua_ValueToNumber(L, 1);
  1322. int nDetailType = (int)Lua_ValueToNumber(L, 2);
  1323. int nParticularType = (int)Lua_ValueToNumber(L, 3);
  1324. int nLevel = (int)Lua_ValueToNumber(L, 4);
  1325. int nSeries = (int)Lua_ValueToNumber(L, 5);
  1326. int nLuck = (int)Lua_ValueToNumber(L, 6);
  1327. int nItemLevel[6];
  1328. ZeroMemory(nItemLevel, sizeof(nItemLevel));
  1329. nItemLevel[0] = (int)Lua_ValueToNumber(L, 7);
  1330. if (nParamNum >= 12)
  1331. {
  1332. nItemLevel[1] = (int)Lua_ValueToNumber(L, 8);
  1333. nItemLevel[2] = (int)Lua_ValueToNumber(L, 9);
  1334. nItemLevel[3] = (int)Lua_ValueToNumber(L, 10);
  1335. nItemLevel[4] = (int)Lua_ValueToNumber(L, 11);
  1336. nItemLevel[5] = (int)Lua_ValueToNumber(L, 12);
  1337. }
  1338. else
  1339. {
  1340. for (int i = 0; i < 5; i ++)
  1341. nItemLevel[i + 1] = nItemLevel[0];
  1342. }
  1343. int nIndex = ItemSet.Add(nItemClass, nSeries, nLevel, nLuck, nDetailType, nParticularType,  nItemLevel, g_SubWorldSet.GetGameVersion());
  1344. if (nIndex <= 0)
  1345. {
  1346. Lua_PushNumber(L, 0);
  1347. return 1;
  1348. }
  1349. int x, y;
  1350. if (Player[nPlayerIndex].m_ItemList.CheckCanPlaceInEquipment(Item[nIndex].GetWidth(), Item[nIndex].GetHeight(), &x, &y))
  1351. {
  1352. Player[nPlayerIndex].m_ItemList.Add(nIndex, pos_equiproom, x, y);
  1353. }
  1354. else
  1355. {
  1356. int nIdx = Player[nPlayerIndex].m_ItemList.Hand();
  1357. if (nIdx)
  1358. {
  1359. Player[nPlayerIndex].m_ItemList.Remove(nIdx);
  1360. KMapPos sMapPos;
  1361. KObjItemInfo sInfo;
  1362. Player[nPlayerIndex].GetAboutPos(&sMapPos);
  1363. sInfo.m_nItemID = nIdx;
  1364. sInfo.m_nItemWidth = Item[nIdx].GetWidth();
  1365. sInfo.m_nItemHeight = Item[nIdx].GetHeight();
  1366. sInfo.m_nMoneyNum = 0;
  1367. strcpy(sInfo.m_szName, Item[nIdx].GetName());
  1368. sInfo.m_nColorID = 0;
  1369. sInfo.m_nMovieFlag = 1;
  1370. sInfo.m_nSoundFlag = 1;
  1371. int nObj = ObjSet.Add(Item[nIdx].GetObjIdx(), sMapPos, sInfo);
  1372. if (nObj >= 0)
  1373. {
  1374. if (Item[nIdx].GetGenre() == item_task)
  1375. {
  1376. Object[nObj].SetEntireBelong(nPlayerIndex);
  1377. }
  1378. else
  1379. {
  1380. Object[nObj].SetItemBelong(nPlayerIndex);
  1381. }
  1382. }
  1383. }
  1384. Player[nPlayerIndex].m_ItemList.Add(nIndex, pos_hand, 0 ,0);
  1385. }
  1386. Lua_PushNumber(L,1);
  1387. return 1;
  1388. }
  1389. int LuaGetTaskItemCount(Lua_State * L)
  1390. {
  1391. if (Lua_GetTopIndex(L) > 0)
  1392. {
  1393. int nPlayerIndex = GetPlayerIndex(L);
  1394. if (nPlayerIndex > 0)
  1395. {
  1396. int nEventId = 0;
  1397. if (Lua_IsNumber(L, 1))
  1398. {
  1399. nEventId = (int)Lua_ValueToNumber(L,1);
  1400. }
  1401. else
  1402. {
  1403. char * szEventItm = (char *)Lua_ValueToString(L,1);
  1404. if (!g_EventItemTab.GetInteger(szEventItm, "具体类别", 0, &nEventId))
  1405. {
  1406. Lua_PushNumber(L,0);
  1407. return 1;
  1408. }
  1409. }
  1410. int nCount = Player[nPlayerIndex].m_ItemList.GetTaskItemNum(nEventId);
  1411. Lua_PushNumber(L, nCount);
  1412. }
  1413. else 
  1414. {
  1415. g_DebugLog("GetItemCount nPlayerIndex <= 0");
  1416. Lua_PushNumber(L,0);
  1417. }
  1418. }
  1419. else
  1420. {
  1421. g_DebugLog("GetItem 参数不够!");
  1422. Lua_PushNumber(L , 0);
  1423. }
  1424. return 1;
  1425. }
  1426. /*nPlayerIndex, nItemTemplateId
  1427. 功能:给玩家某个物品
  1428. */
  1429. /*
  1430. DelItem (nPlayerIndex, nItemTemplateId)
  1431. 功能:删除玩家身上某个物品
  1432. */
  1433. int LuaDelItem(Lua_State * L)
  1434. {
  1435. if (Lua_GetTopIndex(L) > 0)
  1436. {
  1437. int nPlayerIndex = GetPlayerIndex(L);
  1438. if (nPlayerIndex > 0)
  1439. {
  1440. int nEventId = 0;
  1441. if (Lua_IsNumber(L, 1))
  1442. {
  1443. nEventId = (int)Lua_ValueToNumber(L,1);
  1444. }
  1445. else
  1446. {
  1447. char * szEventItm = (char *)Lua_ValueToString(L,1);
  1448. if (!g_EventItemTab.GetInteger(szEventItm, "具体类别", 0, &nEventId))
  1449. {
  1450. return 0;
  1451. }
  1452. }
  1453. int nResult = Player[nPlayerIndex].m_ItemList.RemoveTaskItem(nEventId);
  1454. }
  1455. else 
  1456. {
  1457. g_DebugLog("[TASK] Can Not Del Item ");
  1458. }
  1459. }
  1460. else
  1461. {
  1462. g_DebugLog("HaveItem 参数不够!");
  1463. }
  1464. return 0;
  1465. }
  1466. /*HaveItem(nItemTemplateId);
  1467. 功能:检查玩家是否有某个物品
  1468. */
  1469. int LuaHaveItem(Lua_State *L)
  1470. {
  1471. if (Lua_GetTopIndex(L) > 0)
  1472. {
  1473. int nPlayerIndex = GetPlayerIndex(L);
  1474. if (nPlayerIndex > 0)
  1475. {
  1476. int nEventId = 0;
  1477. if (Lua_IsNumber(L, 1))
  1478. {
  1479. nEventId = (int)Lua_ValueToNumber(L,1);
  1480. }
  1481. else
  1482. {
  1483. char * szEventItm = (char *)Lua_ValueToString(L,1);
  1484. if (!g_EventItemTab.GetInteger(szEventItm, "具体类别", 0, &nEventId))
  1485. {
  1486. Lua_PushNumber(L,0);
  1487. return 1;
  1488. }
  1489. }
  1490. int nResult = Player[nPlayerIndex].m_ItemList.IsTaskItemExist(nEventId);
  1491. Lua_PushNumber(L, (nResult != 0));
  1492. }
  1493. else 
  1494. {
  1495. g_DebugLog("HaveItem nPlayerIndex <= 0");
  1496. Lua_PushNumber(L,0);
  1497. }
  1498. }
  1499. else
  1500. {
  1501. g_DebugLog("HaveItem 参数不够!");
  1502. Lua_PushNumber(L , 0);
  1503. }
  1504. return 1;
  1505. }
  1506. /*
  1507. AddMagic(nPlayerIndex, nMagicID, nLevel)
  1508. DelMagic(nPlayerIndex, nMagicId)
  1509. HaveMagic(nPlayerIndex, nMagicId)
  1510. GetMagicLevel(nPlayerIndex, nMagicId)
  1511. SetMagicLevel(nPlayerIndex, nMagicId, nLevel)
  1512. ModifyMagicLevel(nPlayerIndex ,nMagicId, nDLevel)
  1513. */
  1514. int LuaAddMagic(Lua_State * L)
  1515. {
  1516. int nParamCount = Lua_GetTopIndex(L);
  1517. int nPlayerIndex = 0;
  1518. if (nParamCount < 1) return 0;
  1519. nPlayerIndex = GetPlayerIndex(L);
  1520. if (nPlayerIndex <= 0) return 0;
  1521. int nSkillId = 0;
  1522. if (Lua_IsNumber(L, 1))
  1523. {
  1524. nSkillId = (int)Lua_ValueToNumber (L, 1);
  1525. }
  1526. else 
  1527. {
  1528. const char * sSkillName = Lua_ValueToString(L, 1);
  1529. g_OrdinSkillsSetting.GetInteger((char*)sSkillName, "SkillId", 0, &nSkillId);
  1530. if (nSkillId <= 0 ) return 0;
  1531. }
  1532.     Player[nPlayerIndex].m_nIndex;
  1533. int nLevel = 0;
  1534. if (nParamCount >=2)
  1535. nLevel = (int)Lua_ValueToNumber(L,2);
  1536. else
  1537. nLevel = 0;
  1538.     int nRet = Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.Add(nSkillId, nLevel);
  1539. if (nRet)
  1540. {
  1541. PLAYER_SKILL_LEVEL_SYNC NewSkill;
  1542. NewSkill.ProtocolType = s2c_playerskilllevel;
  1543. NewSkill.m_nSkillID = nSkillId;
  1544. NewSkill.m_nSkillLevel = Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.GetCurrentLevel(nSkillId);
  1545. NewSkill.m_nLeavePoint = Player[nPlayerIndex].m_nSkillPoint;
  1546. g_pServer->PackDataToClient(Player[nPlayerIndex].m_nNetConnectIdx, (BYTE*)&NewSkill, sizeof(PLAYER_SKILL_LEVEL_SYNC));
  1547. }
  1548. return 0;
  1549. }
  1550. int LuaDelMagic(Lua_State * L)
  1551. {
  1552. int nParamCount = Lua_GetTopIndex(L);
  1553. int nPlayerIndex = 0;
  1554. if (nParamCount < 1) return 0;
  1555.     nPlayerIndex = GetPlayerIndex(L);
  1556. if (nPlayerIndex <= 0) return 0;
  1557. int nSkillId = 0;
  1558. if (Lua_IsNumber(L, 1))
  1559. {
  1560. nSkillId = (int)Lua_ValueToNumber (L, 1);
  1561. }
  1562. else 
  1563. {
  1564. const char * sSkillName = Lua_ValueToString(L, 1);
  1565. g_OrdinSkillsSetting.GetInteger((char*)sSkillName, "SkillId", 0, &nSkillId);
  1566. if (nSkillId <= 0 ) return 0;
  1567. }
  1568. Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.Remove(nSkillId);
  1569. return 0;
  1570. }
  1571. int LuaHaveMagic(Lua_State * L)
  1572. {
  1573. int nParamCount = Lua_GetTopIndex(L);
  1574. int nPlayerIndex = 0;
  1575. if (nParamCount < 1) return 0;
  1576. nPlayerIndex = GetPlayerIndex(L);
  1577. if (nPlayerIndex <= 0) return 0;
  1578. int nSkillId = 0;
  1579. if (Lua_IsNumber(L, 1))
  1580. {
  1581. nSkillId = (int)Lua_ValueToNumber (L, 1);
  1582. }
  1583. else 
  1584. {
  1585. const char * sSkillName = Lua_ValueToString(L, 1);
  1586. g_OrdinSkillsSetting.GetInteger((char *)sSkillName, "SkillId", 0, &nSkillId);
  1587. if (nSkillId <= 0 ) 
  1588. {
  1589. Lua_PushNumber(L, -1);
  1590. }
  1591. return 1;
  1592. }
  1593. if (Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.FindSame(nSkillId))
  1594. {
  1595. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.GetLevel(nSkillId));
  1596. }
  1597. else
  1598. {
  1599. Lua_PushNumber(L, -1);
  1600. }
  1601. return 1;
  1602. }
  1603. int LuaGetSkillIdInSkillList(Lua_State * L)
  1604. {
  1605. if (Lua_GetTopIndex(L) < 1) 
  1606. return 0;
  1607. int nPlayerIndex = GetPlayerIndex(L);
  1608. if (nPlayerIndex <= 0) 
  1609. return 0;
  1610. int nSkillIndex = (int)Lua_ValueToNumber (L, 1);
  1611. int nSkillId = 0;
  1612. if (nSkillIndex > 0) 
  1613. {
  1614. nSkillId = Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.GetSkillId(nSkillIndex);
  1615. }
  1616. Lua_PushNumber(L, nSkillId);
  1617. return 1;
  1618. }
  1619. int LuaSetSkillLevel(Lua_State * L)
  1620. {
  1621. if (Lua_GetTopIndex(L) < 2) 
  1622. return 0;
  1623. int nPlayerIndex = GetPlayerIndex(L);
  1624. if (nPlayerIndex <= 0) 
  1625. return 0;
  1626. int nSkillId = 0;
  1627. if (Lua_IsNumber(L, 1))
  1628. {
  1629. nSkillId = (int)Lua_ValueToNumber (L, 1);
  1630. }
  1631. else 
  1632. {
  1633. const char * sSkillName = Lua_ValueToString(L, 1);
  1634. g_OrdinSkillsSetting.GetInteger((char *)sSkillName, "SkillId", 0, &nSkillId);
  1635. if (nSkillId <= 0 ) return 0;
  1636. }
  1637. int nLevel = (int)Lua_ValueToNumber(L, 2);
  1638. if (nLevel >= 0)
  1639. Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.SetSkillLevelDirectlyUsingId(nSkillId, nLevel);
  1640. return 0;
  1641. }
  1642. int LuaRollBackSkills(Lua_State * L)
  1643. {
  1644. int nPlayerIndex = GetPlayerIndex(L);
  1645. if (nPlayerIndex <= 0) 
  1646. return 0;
  1647. int nSkillId = 0;
  1648. int nTotalSkill = Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.ClearSkillLevel(true);
  1649. Lua_PushNumber(L, nTotalSkill);
  1650. return 1;
  1651. }
  1652. int LuaUpdateSkillList(Lua_State * L)
  1653. {
  1654. int nPlayerIndex = GetPlayerIndex(L);
  1655. if (nPlayerIndex <= 0) 
  1656. return 0;
  1657. Player[nPlayerIndex].SendSyncData_Skill();
  1658. return 0;
  1659. }
  1660. int LuaGetMagicLevel(Lua_State * L)
  1661. {
  1662. int nParamCount = Lua_GetTopIndex(L);
  1663. int nPlayerIndex = 0;
  1664. if (nParamCount < 1) return 0;
  1665. nPlayerIndex = GetPlayerIndex(L);
  1666. if (nPlayerIndex <= 0) return 0;
  1667. int nSkillId = 0;
  1668. if (Lua_IsNumber(L, 1))
  1669. {
  1670. nSkillId = (int)Lua_ValueToNumber (L, 1);
  1671. }
  1672. else 
  1673. {
  1674. const char * sSkillName = Lua_ValueToString(L, 1);
  1675. g_OrdinSkillsSetting.GetInteger((char *)sSkillName, "SkillId", 0, &nSkillId);
  1676. if (nSkillId <= 0 ) return 0;
  1677. }
  1678. Lua_PushNumber(L,Npc[Player[nPlayerIndex].m_nIndex].m_SkillList.GetLevel(nSkillId));
  1679. return 1;
  1680. }
  1681. /*
  1682. int LuaSetMagicLevel(Lua_State * L)
  1683. {
  1684. int nParamCount = Lua_GetTopIndex(L);
  1685. int nPlayerIndex = 0;
  1686. int nTemp = 0;
  1687. if (nParamCount < 1) return 0;
  1688.   nPlayerIndex = GetPlayerIndex(L);
  1689.   
  1690. if (nPlayerIndex <= 0) return 0;
  1691.   int nSkillId = 0;
  1692.   if (Lua_IsNumber(L, nTemp))
  1693.   {
  1694.   nSkillId = (int)Lua_ValueToNumber (L, 1);
  1695.   }
  1696.   else 
  1697.   {
  1698.   const char * sSkillName = Lua_ValueToString(L, 1);
  1699.   nSkillId = g_OrdinSkillsSetting.FindRow((char *)sSkillName) - 2;
  1700.   if (nSkillId <= 0 ) return 0;
  1701.   }
  1702.   int nNpcIndex = Player[nPlayerIndex].m_nIndex;
  1703.   if (nNpcIndex > 0)
  1704.   Lua_PushNumber(L,Npc[nNpcIndex].m_SkillList.SetSkillLevel(nSkillId, (int)Lua_ValueToNumber(L, 2)));
  1705.   return 0;
  1706.   }
  1707. */
  1708. //**************************************************************************************************************************************************************
  1709. // NPC操作脚本
  1710. //**************************************************************************************************************************************************************
  1711. /*nNpcTemplateId GetNpcTmpId(sName)
  1712. 功能从Npc模板中获得名称为sName的Npc在模板中的Id
  1713. sName:Npc名称
  1714. nNpcTemplateID:模板中Id
  1715. */
  1716. int LuaGetNpcTemplateID(Lua_State * L)
  1717. {
  1718. if (Lua_GetTopIndex(L) > 0)
  1719. {
  1720. if (Lua_IsString(L,1))
  1721. {
  1722. const char * pName = lua_tostring(L,1);
  1723. int nId = g_NpcSetting.FindRow((char*)pName) - 2;
  1724. Lua_PushNumber(L, nId);
  1725. }
  1726. else
  1727. return 0;
  1728. }
  1729. else 
  1730. return 0;
  1731. return 1;
  1732. }
  1733. /*
  1734. nNpcIndex AddNpc(nNpcTemplateId,nLevel, nSubWorldIndex, nPosX, nPosY )
  1735.   功能:增加一个特定的NPC
  1736.   参数:
  1737.   nNpcTemplateId: NPC在NPC模板中的id
  1738.   nLevel:Npc的等级
  1739.   nSubWorldIndex:所处的世界id
  1740.   nPosX:X (点坐标)
  1741.   nPosY:Y (点坐标)
  1742.   nNpcIndex:增加后,将返回该Npc在游戏世界的Index,如果不成功返回nil 
  1743. */
  1744. int LuaAddNpc(Lua_State * L)
  1745. {
  1746. char * pName = NULL;
  1747. int    nId = 0;
  1748. if (Lua_GetTopIndex(L) < 5) return 0;
  1749. if (Lua_IsNumber(L,1))
  1750. {
  1751. nId = (int)Lua_ValueToNumber(L,1);
  1752. }
  1753. else if (Lua_IsString(L,1))
  1754. {
  1755. pName = (char *)lua_tostring(L,1);
  1756. nId = g_NpcSetting.FindRow((char*)pName) - 2;
  1757. }
  1758. else return 0;
  1759. if (nId < 0) nId = 0;
  1760. int nLevel = (int)lua_tonumber(L,2);
  1761. //if (nLevel >= 128) nLevel = 127;
  1762. if (nLevel < 0 ) nLevel = 1;
  1763. int nNpcIdxInfo = MAKELONG(nLevel, nId);//(nId << 7) + nLevel;
  1764. //question
  1765. int nNpcIdx = NpcSet.Add(nNpcIdxInfo, (int)lua_tonumber(L, 3), (int)lua_tonumber(L,4), (int)lua_tonumber(L,5));
  1766. // g_StrCpy(Npc[nNpcIdx].Name, (char*)pName);
  1767. Lua_PushNumber(L, nNpcIdx);
  1768.     return 1;
  1769. }
  1770. /*nResult DelNpc (nNpcIndex)
  1771. 功能:删除一个特定的NPC
  1772. nResult:返回成功与否,1为成功,0为失败
  1773. */
  1774. int LuaDelNpc(Lua_State * L)
  1775. {
  1776. if (Lua_GetTopIndex(L) <= 0 ) return 0 ;
  1777. int nNpcIndex = (int)Lua_ValueToNumber(L, 1);
  1778. if (nNpcIndex > 0)
  1779. {
  1780. if (Npc[nNpcIndex].m_RegionIndex >= 0)
  1781. {
  1782. SubWorld[Npc[nNpcIndex].m_SubWorldIndex].m_Region[Npc[nNpcIndex].m_RegionIndex].RemoveNpc(nNpcIndex);
  1783. SubWorld[Npc[nNpcIndex].m_SubWorldIndex].m_Region[Npc[nNpcIndex].m_RegionIndex].DecRef(Npc[nNpcIndex].m_MapX, Npc[nNpcIndex].m_MapY, obj_npc);
  1784. }
  1785. NpcSet.Remove(nNpcIndex);
  1786. }
  1787. return 0;
  1788. }
  1789. /*
  1790. nDelCount DelNpcsInRgn(nSubWorld,nRegionId, nKind) 
  1791. 功能:删除某个游戏世界中某个Region内的所有某类的NPC
  1792. 返回:删除的Npc个数
  1793. */
  1794. int LuaDelNpcsInRgn(Lua_State * L)
  1795. {
  1796. //Question
  1797. return 0;
  1798. }
  1799. /*
  1800. nDelCount DelNpcsInWld(nSubWorldId, nKind)
  1801. 功能:删除某个游戏世界中的所有Npc
  1802. */
  1803. int LuaDelNpcsInWld(Lua_State * L)
  1804. {
  1805. return 0;
  1806. }
  1807. /*
  1808. SetNpcPos (nNpcIndex, x, y)
  1809. 功能:设置/修改一个NPC的位置
  1810. 参数:
  1811. nNpcIndex:Npc的id 
  1812. x:X坐标
  1813. y:Y坐标
  1814. */
  1815. int LuaSetNpcPos(Lua_State * L)
  1816. {
  1817. int nParamCount = 0;
  1818. if ((nParamCount = Lua_GetTopIndex(L)) < 3) return 0;
  1819. int nNpcIndex = (int)Lua_ValueToNumber(L, 1);
  1820. if (nNpcIndex <= 0) return 0;
  1821. Npc[nNpcIndex].m_MapX = (int)Lua_ValueToNumber(L, 2);
  1822. Npc[nNpcIndex].m_MapY = (int)Lua_ValueToNumber(L, 3);
  1823. return 0;
  1824. }
  1825. /*SetNpcDthSct (nNpcIndex, map, “*.txt” )
  1826. 功能:设置NPC死亡脚本
  1827. 参数:
  1828. nNpcIndex:NPCIndex
  1829. *.txt:脚本文件名
  1830. */
  1831. int LuaSetNpcActionScript(Lua_State * L)
  1832. {
  1833. if (Lua_GetTopIndex(L) < 2 ) return 0;
  1834. int nNpcIndex = (int)Lua_ValueToNumber(L, 1);
  1835. if (nNpcIndex <= 0 || nNpcIndex >= MAX_NPC) return 0;
  1836. strcpy(Npc[nNpcIndex].ActionScript, Lua_ValueToString(L,2));
  1837. Npc[nNpcIndex].m_ActionScriptID = g_FileName2Id((char *)Lua_ValueToString(L,2));
  1838. return 0;
  1839. }
  1840. /*
  1841. SetRevivalPos(subworldid = -1, revid )
  1842. 功能:设置Npc重生点
  1843. */
  1844. int LuaSetPlayerRevivalPos(Lua_State * L)
  1845. {
  1846. //Question
  1847. int nParamCount = Lua_GetTopIndex(L);
  1848. int nPlayerIndex = 0;
  1849. int nBeginIndex = 2;
  1850. nPlayerIndex = GetPlayerIndex(L);
  1851. int nSubWorldId = 0;
  1852. int nRevId = 0;
  1853. if (nPlayerIndex < 0) 
  1854. {
  1855. return 0;
  1856. }
  1857. if (nParamCount >= 2)
  1858. {
  1859. nSubWorldId = (int) Lua_ValueToNumber(L, 1);
  1860. nRevId = (int) Lua_ValueToNumber(L, 2);
  1861. }
  1862. else if (nParamCount == 1)
  1863. {
  1864. nSubWorldId = -1;
  1865. nRevId = (int) Lua_ValueToNumber(L, 1);
  1866. }
  1867. else 
  1868. {
  1869. return 0;
  1870. }
  1871. Player[nPlayerIndex].SetRevivalPos(nSubWorldId, nRevId);
  1872. return 0;
  1873. }
  1874. //**************************************************************************************************************************************************************
  1875. // 聊天消息脚本
  1876. //**************************************************************************************************************************************************************
  1877. //**********************************************************************************************
  1878. // 主角属性获得
  1879. //**********************************************************************************************
  1880. #define MacroFun_GetPlayerInfoInt(L, MemberName) { int nPlayerIndex = GetPlayerIndex(L);
  1881. if (nPlayerIndex > 0){ int nNpcIndex = Player[nPlayerIndex].m_nIndex; if (nNpcIndex > 0)Lua_PushNumber(L, Npc[nNpcIndex].MemberName);
  1882. else Lua_PushNil(L);}
  1883. else Lua_PushNil(L);
  1884. return 1;}
  1885. //阵营
  1886. int LuaGetPlayerCurrentCamp(Lua_State * L)
  1887. {
  1888. MacroFun_GetPlayerInfoInt(L, m_CurrentCamp);
  1889. }
  1890. int LuaGetPlayerCamp(Lua_State * L)
  1891. {
  1892. MacroFun_GetPlayerInfoInt(L, m_Camp);
  1893. }
  1894. int LuaSetPlayerCamp(Lua_State * L)
  1895. {
  1896. int nValue = (int)Lua_ValueToNumber(L,1);
  1897. if (nValue < 0 ) return 0;
  1898. int nPlayerIndex = GetPlayerIndex(L);
  1899. if (nPlayerIndex > 0)
  1900. {
  1901. Npc[Player[nPlayerIndex].m_nIndex].SetCamp(nValue);
  1902. }
  1903. return 0;
  1904. }
  1905. int LuaSetPlayerCurrentCamp(Lua_State * L)
  1906. {
  1907. int nValue = (int)Lua_ValueToNumber(L,1);
  1908. if (nValue < 0 ) return 0;
  1909. int nPlayerIndex = GetPlayerIndex(L);
  1910. if (nPlayerIndex > 0)
  1911. {
  1912. Npc[Player[nPlayerIndex].m_nIndex].SetCurrentCamp(nValue);
  1913. }
  1914. return 0;
  1915. }
  1916. int LuaSetNpcCurCamp(Lua_State * L)
  1917. {
  1918. int nNpcIndex = (int)Lua_ValueToNumber(L,1);
  1919. if (nNpcIndex <= 0 && nNpcIndex > MAX_NPC) return 0;
  1920. int nValue = (int )Lua_ValueToNumber(L,2);
  1921. if (nValue >= camp_num) return 0;
  1922. Npc[nNpcIndex].SetCurrentCamp(nValue);
  1923. return 0;
  1924. }
  1925. int LuaRestorePlayerCamp(Lua_State * L)
  1926. {
  1927. int nPlayerIndex = GetPlayerIndex(L);
  1928. if (nPlayerIndex > 0)
  1929. {
  1930. Npc[Player[nPlayerIndex].m_nIndex].RestoreCurrentCamp();
  1931. }
  1932. return 0;
  1933. }
  1934. int LuaOpenTong(Lua_State * L)
  1935. {
  1936. if (Lua_GetTopIndex(L) < 1) 
  1937. return 0;
  1938. int nPlayerIndex = GetPlayerIndex(L);
  1939. if (nPlayerIndex < 0) return 0;
  1940. PLAYER_SCRIPTACTION_SYNC UiInfo;
  1941. UiInfo.m_bUIId = UI_OPENTONGUI;
  1942. UiInfo.m_bOptionNum = 0;
  1943. UiInfo.m_nOperateType = SCRIPTACTION_UISHOW;
  1944. int nMsgId = 0;
  1945. UiInfo.m_bParam1 = 0;
  1946. UiInfo.m_nBufferLen = sizeof(int);
  1947. #ifndef _SERVER
  1948. UiInfo.m_bParam2 = 0;
  1949. Player[nPlayerIndex].DoScriptAction(&UiInfo);
  1950. #else
  1951. UiInfo.m_bParam2 = 1;
  1952. UiInfo.ProtocolType = (BYTE)s2c_scriptaction;
  1953. UiInfo.m_wProtocolLong = sizeof(PLAYER_SCRIPTACTION_SYNC) - MAX_SCIRPTACTION_BUFFERNUM + UiInfo.m_nBufferLen - 1;
  1954. g_NewProtocolProcess.BroadcastGlobal(&UiInfo, UiInfo.m_wProtocolLong + 1);
  1955. #endif
  1956. return 0;
  1957. }
  1958. //门派
  1959. int LuaGetPlayerFaction(Lua_State * L)
  1960. {
  1961. int nPlayerIndex = GetPlayerIndex(L);
  1962. if (nPlayerIndex > 0)
  1963. {
  1964. char FactionName[100];
  1965. Player[nPlayerIndex].GetFactionName(FactionName, 100);
  1966. Lua_PushString(L, FactionName);
  1967. }
  1968. else
  1969. {
  1970. Lua_PushString(L,"");
  1971. }
  1972. return 1;
  1973. }
  1974. int LuaChangePlayerFaction(Lua_State * L)
  1975. {
  1976. int nPlayerIndex = GetPlayerIndex(L);
  1977. int nResult = 0;
  1978. if (nPlayerIndex > 0)
  1979. {
  1980. const char * szFactionName = Lua_ValueToString(L,1);
  1981. Player[nPlayerIndex].LeaveCurFaction();
  1982. if (strlen(szFactionName) == 0) 
  1983. {
  1984. nResult = 1;
  1985. }
  1986. else
  1987. {
  1988. nResult = Player[nPlayerIndex].AddFaction((char *)szFactionName);
  1989. }
  1990. }
  1991. Lua_PushNumber(L, nResult);
  1992. return 1;
  1993. }
  1994. //抗性 *************************************************************************************
  1995. //0表示当前,1表示原始的,2表示最大的
  1996. int LuaGetPlayerColdResist(Lua_State * L)
  1997. {
  1998. int nPlayerIndex = GetPlayerIndex(L);
  1999. if (nPlayerIndex > 0)
  2000. {
  2001. int nType = (int)Lua_ValueToNumber(L,1);
  2002. switch((int)Lua_ValueToNumber(L,1))
  2003. {
  2004. case 0:
  2005. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_CurrentColdResist);break;
  2006. case 1:
  2007. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_ColdResist); break;
  2008. case 2:
  2009. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_ColdResistMax);break;
  2010. default:
  2011. Lua_PushNil(L);
  2012. }
  2013. else 
  2014. Lua_PushNil(L);
  2015. return 1;
  2016. }
  2017. int LuaSetPlayerColdResist(Lua_State * L)
  2018. {
  2019. int nPlayerIndex = GetPlayerIndex(L);
  2020. if (nPlayerIndex > 0)
  2021. {
  2022. int nValue = (int)Lua_ValueToNumber(L,2);
  2023. if (nValue < 0) nValue = 0;
  2024. if (nValue > Npc[Player[nPlayerIndex].m_nIndex].m_ColdResistMax) nValue = Npc[Player[nPlayerIndex].m_nIndex].m_ColdResistMax;
  2025. int nType = (int)Lua_ValueToNumber(L,1);
  2026. switch((int)Lua_ValueToNumber(L,1))
  2027. {
  2028. case 0:
  2029. Npc[Player[nPlayerIndex].m_nIndex].m_CurrentColdResist = nValue;
  2030. break;
  2031. case 1:
  2032. Npc[Player[nPlayerIndex].m_nIndex].m_ColdResist = nValue;
  2033. break;
  2034. case 2:
  2035. Npc[Player[nPlayerIndex].m_nIndex].m_ColdResistMax = nValue;
  2036. break;
  2037. }
  2038. return 0;
  2039. }
  2040. int LuaGetPlayerFireResist(Lua_State * L)
  2041. {
  2042. int nPlayerIndex = GetPlayerIndex(L);
  2043. if (nPlayerIndex > 0)
  2044. {
  2045. int nType = (int)Lua_ValueToNumber(L,1);
  2046. switch((int)Lua_ValueToNumber(L,1))
  2047. {
  2048. case 0:
  2049. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_CurrentFireResist);break;
  2050. case 1:
  2051. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_FireResist); break;
  2052. case 2:
  2053. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_FireResistMax);break;
  2054. default:
  2055. Lua_PushNil(L);
  2056. }
  2057. else 
  2058. Lua_PushNil(L);
  2059. return 1;
  2060. }
  2061. int LuaSetPlayerFireResist(Lua_State * L)
  2062. {
  2063. int nPlayerIndex = GetPlayerIndex(L);
  2064. if (nPlayerIndex > 0)
  2065. {
  2066. int nValue = (int)Lua_ValueToNumber(L,2);
  2067. if (nValue < 0) nValue = 0;
  2068. if (nValue > Npc[Player[nPlayerIndex].m_nIndex].m_FireResistMax) nValue = Npc[Player[nPlayerIndex].m_nIndex].m_FireResistMax;
  2069. int nType = (int)Lua_ValueToNumber(L,1);
  2070. switch((int)Lua_ValueToNumber(L,1))
  2071. {
  2072. case 0:
  2073. Npc[Player[nPlayerIndex].m_nIndex].m_CurrentFireResist = nValue;
  2074. break;
  2075. case 1:
  2076. Npc[Player[nPlayerIndex].m_nIndex].m_FireResist = nValue;
  2077. break;
  2078. case 2:
  2079. Npc[Player[nPlayerIndex].m_nIndex].m_FireResistMax = nValue;
  2080. break;
  2081. }
  2082. return 0;
  2083. }
  2084. int LuaGetPlayerLightResist(Lua_State * L)
  2085. {
  2086. int nPlayerIndex = GetPlayerIndex(L);
  2087. if (nPlayerIndex > 0)
  2088. {
  2089. int nType = (int)Lua_ValueToNumber(L,1);
  2090. switch((int)Lua_ValueToNumber(L,1))
  2091. {
  2092. case 0:
  2093. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_CurrentLightResist);break;
  2094. case 1:
  2095. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_LightResist); break;
  2096. case 2:
  2097. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_LightResistMax);break;
  2098. default:
  2099. Lua_PushNil(L);
  2100. }
  2101. else
  2102. Lua_PushNil(L);
  2103. return 1;
  2104. }
  2105. int LuaSetPlayerLightResist(Lua_State * L)
  2106. {
  2107. int nPlayerIndex = GetPlayerIndex(L);
  2108. if (nPlayerIndex > 0)
  2109. {
  2110. int nValue = (int)Lua_ValueToNumber(L,2);
  2111. if (nValue < 0) nValue = 0;
  2112. if (nValue > Npc[Player[nPlayerIndex].m_nIndex].m_LightResistMax) nValue = Npc[Player[nPlayerIndex].m_nIndex].m_LightResistMax;
  2113. int nType = (int)Lua_ValueToNumber(L,1);
  2114. switch((int)Lua_ValueToNumber(L,1))
  2115. {
  2116. case 0:
  2117. Npc[Player[nPlayerIndex].m_nIndex].m_CurrentLightResist = nValue;
  2118. break;
  2119. case 1:
  2120. Npc[Player[nPlayerIndex].m_nIndex].m_LightResist = nValue;
  2121. break;
  2122. case 2:
  2123. Npc[Player[nPlayerIndex].m_nIndex].m_LightResistMax = nValue;
  2124. break;
  2125. }
  2126. else 
  2127. Lua_PushNil(L);
  2128. return 0;
  2129. }
  2130. int LuaGetPlayerPoisonResist(Lua_State * L)
  2131. {
  2132. int nPlayerIndex = GetPlayerIndex(L);
  2133. if (nPlayerIndex > 0)
  2134. {
  2135. int nType = (int)Lua_ValueToNumber(L,1);
  2136. switch((int)Lua_ValueToNumber(L,1))
  2137. {
  2138. case 0:
  2139. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_CurrentPoisonResist);break;
  2140. case 1:
  2141. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResist); break;
  2142. case 2:
  2143. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResistMax);break;
  2144. default:
  2145. Lua_PushNil(L);
  2146. }
  2147. else
  2148. Lua_PushNil(L);
  2149. return 1;
  2150. }
  2151. int LuaSetPlayerPoisonResist(Lua_State * L)
  2152. {
  2153. int nPlayerIndex = GetPlayerIndex(L);
  2154. if (nPlayerIndex > 0)
  2155. {
  2156. {
  2157. int nValue = (int)Lua_ValueToNumber(L,2);
  2158.             if (nValue < 0) nValue = 0;
  2159.             if (nValue > Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResistMax) nValue = Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResistMax;
  2160.             int nType = (int)Lua_ValueToNumber(L,1);
  2161. switch((int)Lua_ValueToNumber(L,1))
  2162. {
  2163. case 0:
  2164. Npc[Player[nPlayerIndex].m_nIndex].m_CurrentPoisonResist = nValue;
  2165. break;
  2166. case 1:
  2167. Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResist = nValue;
  2168.                 break;
  2169. case 2:
  2170. Npc[Player[nPlayerIndex].m_nIndex].m_PoisonResistMax = nValue;
  2171.                 break;
  2172. }
  2173. }
  2174. return 0;
  2175. }
  2176. int LuaGetPlayerPhysicsResist(Lua_State * L)
  2177. {
  2178. int nPlayerIndex = GetPlayerIndex(L);
  2179. if (nPlayerIndex > 0)
  2180. {
  2181. {
  2182. int nType = (int)Lua_ValueToNumber(L,1);
  2183. switch((int)Lua_ValueToNumber(L,1))
  2184. {
  2185. case 0:
  2186. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_CurrentPhysicsResist);break;
  2187. case 1:
  2188. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResist); break;
  2189. case 2:
  2190. Lua_PushNumber(L, Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResistMax);break;
  2191. default:
  2192. Lua_PushNil(L);
  2193. }
  2194. }
  2195. else
  2196. Lua_PushNil(L);
  2197. return 1;
  2198. }
  2199. int LuaSetPlayerPhysicsResist(Lua_State * L)
  2200. {
  2201. int nPlayerIndex = GetPlayerIndex(L);
  2202. if (nPlayerIndex > 0)
  2203. {
  2204. {
  2205. int nValue = (int)Lua_ValueToNumber(L,2);
  2206.             if (nValue < 0) nValue = 0;
  2207.             if (nValue > Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResistMax) nValue = Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResistMax;
  2208.             int nType = (int)Lua_ValueToNumber(L,1);
  2209. switch((int)Lua_ValueToNumber(L,1))
  2210. {
  2211. case 0:
  2212. Npc[Player[nPlayerIndex].m_nIndex].m_CurrentPhysicsResist = nValue;
  2213. break;
  2214. case 1:
  2215. Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResist = nValue;
  2216.                 break;
  2217. case 2:
  2218. Npc[Player[nPlayerIndex].m_nIndex].m_PhysicsResistMax = nValue;
  2219.                 break;
  2220. }
  2221. }
  2222. return 0;
  2223. }
  2224. //经验值*********************************************************************
  2225. int LuaGetPlayerExp(Lua_State *L)
  2226. {
  2227. int nPlayerIndex = GetPlayerIndex(L);
  2228. if (nPlayerIndex > 0)
  2229. {
  2230.         Lua_PushNumber(L, Player[nPlayerIndex].m_nExp);
  2231. }
  2232. else
  2233. Lua_PushNil(L);
  2234. return 1;
  2235. }
  2236. //AddExp(200,10,0)
  2237. int LuaModifyPlayerExp(Lua_State * L)
  2238. {
  2239. int bAllTeamGet = 0;
  2240. if(Lua_GetTopIndex(L) >= 3) bAllTeamGet = (int)Lua_ValueToNumber(L,3);
  2241. int nDValue = (int)Lua_ValueToNumber(L,1);
  2242. int nTarLevel = (int)Lua_ValueToNumber(L,2);
  2243. int nPlayerIndex = GetPlayerIndex(L);
  2244. if (nPlayerIndex > 0)
  2245. {
  2246. if (bAllTeamGet)
  2247. Player[nPlayerIndex].AddExp(nDValue, nTarLevel);
  2248. else
  2249. Player[nPlayerIndex].AddSelfExp(nDValue, nTarLevel);
  2250. }
  2251. return 0;
  2252. }
  2253. int LuaAddOwnExp(Lua_State * L)
  2254. {
  2255. if (Lua_GetTopIndex(L) <=0 ) return 0;
  2256. int nPlayerIndex = GetPlayerIndex(L);
  2257. if (nPlayerIndex > 0)
  2258. {
  2259. int nExp = (int)Lua_ValueToNumber(L,1);
  2260. if (nExp >= 0)
  2261. Player[nPlayerIndex].DirectAddExp((int)Lua_ValueToNumber(L,1));
  2262. }
  2263. return 0;
  2264. }
  2265. int LuaGetPlayerLevel(Lua_State * L)
  2266. {
  2267. int nPlayerIndex = GetPlayerIndex(L);