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

模拟服务器

开发平台:

C/C++

  1.  /*****************************************************************************************
  2. // 快捷键系统
  3. // Copyright : Kingsoft 2002
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-1-13
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "ShortcutKey.h"
  10. #include "UiBase.h"
  11. #include "UiCase/UiTeamManage.h"
  12. #include "UiCase/UiOptions.h"
  13. #include "UiCase/UiStatus.h"
  14. #include "UiCase/UiItem.h"
  15. #include "UiCase/UiSkills.h"
  16. #include "UiCase/UiChannelSubscibe.h"
  17. #include "UiCase/UiPlayerBar.h"
  18. #include "UiCase/UiESCDlg.h"
  19. #include "UiCase/UiSkillTree.h"
  20. #include "UiCase/UiMiniMap.h"
  21. #include "UiCase/UiMsgCentrePad.h"
  22. #include "UiCase/UiChatCentre.h"
  23. #include "UICase/UiFaceSelector.h"
  24. #include "UICase/UiHelper.h"
  25. #include "UICase/UiHelper2.h"
  26. #include "UICase/UiTaskNote.h"
  27. #include "UiCase/UiTrade.h"
  28. #include "UiCase/UiShop.h"
  29. #include "UiCase/UiStoreBox.h"
  30. #include "UiCase/UiHeaderControlBar.h"
  31. #include "UiCase/UiToolsControlBar.h"
  32. #include "UiCase/UiGame.h"
  33. #include "UiCase/UiNewsMessage.h"
  34. #include "UiCase/UiTongCreateSheet.h"
  35. #include "UiCase/uisysmsgcentre.h"
  36. #include "Elem/SpecialFuncs.h"
  37. #include "UiShell.h"
  38. #include "KProtocol.h"
  39. #include "KRelayProtocol.h"
  40. #include "KTongProtocol.h"
  41. #include "../../core/Src/KPlayerMenuState.h"
  42. #include "../../core/src/coreshell.h"
  43. extern iCoreShell* g_pCoreShell;
  44. #include <crtdbg.h>
  45. KLuaScript KShortcutKeyCentre::ms_Script;
  46. COMMAND_SETTING* KShortcutKeyCentre::ms_pCommands = NULL;
  47. int KShortcutKeyCentre::ms_nCommands = 0;
  48. bool KShortcutKeyCentre::ms_Enable = false;
  49. SHORTFUNCMAP KShortcutKeyCentre::ms_FunsMap;
  50. bool KShortcutKeyCentre::ms_bMouse = false;
  51. int KShortcutKeyCentre::ms_MouseX = 0;
  52. int KShortcutKeyCentre::ms_MouseY = 0;
  53. #define UI_AUTOEXEC_SETTING_FILE "\Ui\autoexec.lua"
  54. #define GAME_CONFIG_FILE            "\config.ini"
  55. enum SCREEN_MODE
  56. {
  57. SCREEN_MODE_1D = 1,
  58. SCREEN_MODE_2D = 2,
  59. SCREEN_MODE_3D = 3,
  60. };
  61. //////////////////////////////////////
  62. //x assist funcs
  63. static inline bool __x_isgraph(char c)
  64. {
  65. return c < 0 || isgraph(c);
  66. }
  67. inline bool __x_memcpy_n(void* d, size_t l, const void* s, size_t n) 
  68.         if (l < n) 
  69.                 return false; 
  70.         memcpy(d, s, n); 
  71.         return true; 
  72. //////////////////////////////////////
  73. int KShortcutKeyCentre::HandleKeyInput(unsigned int uKey, int nModifier)
  74. {
  75. int nIndex = FindCommand(MAKELONG(uKey, nModifier));
  76. if (nIndex >= 0)
  77. {
  78. return ExcuteScript(ms_pCommands[nIndex].szDo);
  79. }
  80. return false;
  81. }
  82. int KShortcutKeyCentre::HandleMouseInput(unsigned int uKey, int nModifier, int x, int y)
  83. {
  84. if (ms_bMouse)
  85. return false;
  86. ms_bMouse = true;
  87. ms_MouseX = x;
  88. ms_MouseY = y;
  89. int nIndex = FindCommand(MAKELONG(uKey, nModifier));
  90. int nRet = false;
  91. if (nIndex >= 0)
  92. {
  93. nRet = ExcuteScript(ms_pCommands[nIndex].szDo);
  94. }
  95. ms_bMouse = false;
  96. return nRet;
  97. }
  98. void KShortcutKeyCentre::Enable(bool b)
  99. {
  100. ms_Enable = b;
  101. }
  102. /////////////////////////////////////////////////////////////////////////
  103. //窗口列表
  104. char* l_WindowList[] =
  105. {
  106. "team", //0 队伍
  107. "map", //1 地图
  108. "status", //2 状态
  109. "Items", //3 物品
  110. "skills", //4 技能
  111. "system", //5 系统
  112. "friend", //6 好友
  113. "help", //7 详细帮助
  114. "tasknote", //8 任务记事
  115. "leftskill", //9 左手技能
  116. "rightskill", //10 右手技能
  117. "commandline", //11 命令行
  118. "options", //12 选项
  119. "statustool", //13 状态工具条
  120. "normaltool", //14 常用工具条
  121. "chatroom", //15 聊天窗口
  122. "newsmessage",  //16 新闻窗口
  123. "debug",        //17 调试用的,搞好删掉...
  124. };
  125. int FindWindow(const char* szname)
  126. {
  127. for (int i = 0; i < sizeof(l_WindowList) / sizeof(char*); i++)
  128. {
  129. if (strcmpi(l_WindowList[i], szname) == 0)
  130. return i;
  131. }
  132. return -1;
  133. }
  134. bool UiCloseWndsInGame(bool bAll);
  135. int LuaOpenWindow(Lua_State * L)
  136. {
  137. if (Lua_GetTopIndex(L) != 1) 
  138. return 0;
  139. char * strWindow = (char *)Lua_ValueToString(L, 1);
  140. if (strWindow)
  141. {
  142. switch(FindWindow(strWindow))
  143. {
  144. case 0: //队伍
  145. if (KUiTeamManage::GetIfVisible())
  146. KUiTeamManage::CloseWindow();
  147. else
  148. {
  149. KUiTeamManage::OpenWindow();
  150. }
  151. break;
  152. case 1: //地图
  153. MapToggleStatus();
  154. break;
  155. case 2: //状态
  156. if (KUiStatus::GetIfVisible())
  157. KUiStatus::CloseWindow(false);
  158. else
  159. KUiStatus::OpenWindow();
  160. break;
  161. case 3: //物品
  162. if (KUiItem::GetIfVisible())
  163. KUiItem::CloseWindow(false);
  164. else
  165. KUiItem::OpenWindow();
  166. break;
  167. case 4: //技能
  168. if (KUiSkills::GetIfVisible())
  169. KUiSkills::CloseWindow(false);
  170. else
  171. KUiSkills::OpenWindow();
  172. break;
  173. case 5: //系统
  174. if (UiCloseWndsInGame(false) == false)
  175. KUiESCDlg::OpenWindow();
  176. break;
  177. //选项
  178. case 6: //好友
  179. if (KUiChatCentre::GetIfVisible())
  180. KUiChatCentre::CloseWindow(false);
  181. else
  182. KUiChatCentre::OpenWindow(true);
  183. break;
  184. case 7: //详细帮助
  185. if (KUiHelper2::GetIfVisible())
  186. KUiHelper2::CloseWindow(false);
  187. else
  188. KUiHelper2::OpenWindow(true);
  189. break;
  190. case 8: //任务记事
  191. if (KUiTaskNote::GetIfVisible())
  192. KUiTaskNote::CloseWindow(false);
  193. else
  194. KUiTaskNote::OpenWindow();
  195. break;
  196. case 9: //左手技能
  197. if (KUiSkillTree::GetIfVisible())
  198. KUiSkillTree::CloseWindow(false);
  199. else
  200. KUiSkillTree::OpenWindow(true);
  201. break;
  202. case 10: //右手技能
  203. if (KUiSkillTree::GetIfVisible())
  204. KUiSkillTree::CloseWindow(false);
  205. else
  206. KUiSkillTree::OpenWindow(false);
  207. break;
  208. case 12: //选项
  209. if (KUiOptions::GetIfVisible())
  210. KUiOptions::CloseWindow();
  211. else
  212. KUiOptions::OpenWindow();
  213. break;
  214. case 16: //新闻
  215. if (KUiNewsMessage::GetIfVisible())
  216. KUiNewsMessage::CloseWindow();
  217. else
  218. KUiNewsMessage::OpenWindow();
  219. break;
  220. case 17: //调试用的
  221. if (KUiTongCreateSheet::GetIfVisible())
  222. KUiTongCreateSheet::CloseWindow();
  223. else
  224. KUiTongCreateSheet::OpenWindow();
  225. break;
  226. }
  227. }
  228. return 0;
  229. }
  230. KWndWindow* FindWndWindow(const char* szname)
  231. {
  232. KWndWindow* pWin = NULL;
  233. switch(FindWindow(szname))
  234. {
  235. case 1: //1 地图
  236. pWin = KUiMiniMap::GetSelf();
  237. break;
  238. case 13: //13 状态工具条
  239. pWin = KUiHeaderControlBar::GetSelf();
  240. break;
  241. case 14: //14 常用工具条
  242. pWin = KUiToolsControlBar::GetSelf();
  243. break;
  244. case 15: //15 聊天窗口
  245. pWin = KUiMsgCentrePad::GetSelf();
  246. break;
  247. }
  248. return pWin;
  249. }
  250. int LuaMoveWindow(Lua_State * L)
  251. {
  252. if (Lua_GetTopIndex(L) != 3)
  253. return 0;
  254. char * strWindow = (char *)Lua_ValueToString(L, 1);
  255. int nX = (int)(Lua_ValueToNumber(L, 2));
  256. int nY = (int)(Lua_ValueToNumber(L, 3));
  257. KWndWindow* pWin = FindWndWindow(strWindow);
  258. if (pWin)
  259. {
  260. pWin->SetPosition(nX, nY);
  261. }
  262. return 0;
  263. }
  264. int LuaSizeWindow(Lua_State * L)
  265. {
  266. if (Lua_GetTopIndex(L) != 3)
  267. return 0;
  268. char * strWindow = (char *)Lua_ValueToString(L, 1);
  269. int nW = (int)(Lua_ValueToNumber(L, 2));
  270. int nH = (int)(Lua_ValueToNumber(L, 3));
  271. KWndWindow* pWin = FindWndWindow(strWindow);
  272. if (pWin)
  273. {
  274. pWin->SetSize(nW, nH);
  275. }
  276. return 0;
  277. }
  278. int LuaShowWindow(Lua_State * L)
  279. {
  280. if (Lua_GetTopIndex(L) != 2) 
  281. return 0;
  282. char * strWindow = (char *)Lua_ValueToString(L, 1);
  283. int nShow = (int)(Lua_ValueToNumber(L, 2));
  284. if (strWindow)
  285. {
  286. KWndWindow* pWin = FindWndWindow(strWindow);
  287. if (pWin)
  288. {
  289. if (nShow)
  290. pWin->Show();
  291. else
  292. pWin->Hide();
  293. }
  294. }
  295. return 0;
  296. }
  297. int LuaFocusWindow(Lua_State * L)
  298. {
  299. if (Lua_GetTopIndex(L) != 1) 
  300. return 0;
  301. char * strWindow = (char *)Lua_ValueToString(L, 1);
  302. if (strWindow)
  303. {
  304. switch(FindWindow(strWindow))
  305. {
  306. case 11: // 命令行
  307. KUiPlayerBar::InputNameMsg(false, "", true);
  308. break;
  309. }
  310. }
  311. return 0;
  312. }
  313. int LuaShortcutSkill(Lua_State * L)
  314. {
  315. if (Lua_GetTopIndex(L) != 1) 
  316. return 0;
  317. int nIndex = (int)Lua_ValueToNumber(L, 1);
  318. KUiSkillTree::HandleShortcutKey(nIndex);
  319. return 0;
  320. }
  321. int LuaDirectShortcutSkill(Lua_State * L)
  322. {
  323. if (Lua_GetTopIndex(L) != 1) 
  324. return 0;
  325. int nIndex = (int)Lua_ValueToNumber(L, 1);
  326. KUiSkillTree::DirectHandleShortcutKey(nIndex);
  327. return 0;
  328. }
  329. int LuaShortcutUseItem(Lua_State * L)
  330. {
  331. if (Lua_GetTopIndex(L) != 1) 
  332. return 0;
  333. int nIndex = (int)Lua_ValueToNumber(L, 1);
  334. //快捷物品的使用
  335. KUiPlayerBar::OnUseItem(nIndex);
  336. return 0;
  337. }
  338. //状态列表
  339. char* l_StatusList[] =
  340. {
  341. "run", //0 跑步
  342. "sit", //1 打坐
  343. "trade", //2 交易
  344. "pk", //3 PK
  345. "horse", //4 马
  346. "showplayername", //5 显示玩家名字
  347. "showplayerlife", //6 显示玩家生命
  348. "showplayermana", //7 显示玩家内力
  349. "showplayernumber", //8 界面显示玩家数字
  350. };
  351. int FindStatus(const char* szname)
  352. {
  353. for (int i = 0; i < sizeof(l_StatusList) / sizeof(char*); i++)
  354. {
  355. if (strcmpi(l_StatusList[i], szname) == 0)
  356. return i;
  357. }
  358. return -1;
  359. }
  360. int LuaSwitchStatus(Lua_State * L)
  361. {
  362. if (Lua_GetTopIndex(L) != 1) 
  363. return 0;
  364. char * strStatus = (char *)Lua_ValueToString(L, 1);
  365. if (strStatus)
  366. {
  367. switch(FindStatus(strStatus))
  368. {
  369. case 0: //跑步
  370. if (g_pCoreShell)
  371. g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_RUN, 0);
  372. break;
  373. case 1: //打坐
  374. if (g_pCoreShell)
  375. g_pCoreShell->OperationRequest(GOI_PLAYER_ACTION, PA_SIT, 0);
  376. break;
  377. case 2: //交易
  378. if (g_pCoreShell)
  379. g_pCoreShell->OperationRequest(GOI_TRADE_WILLING, 0, true);
  380. break;
  381. case 3: //PK
  382. if (g_pCoreShell)
  383. {
  384. g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, 
  385. !g_pCoreShell->GetGameData(GDI_PK_SETTING, 0, 0));
  386. }
  387. break;
  388. case 4: //马
  389. //if (g_pCoreShell)
  390. // g_pCoreShell->OperationRequest(GOI_PK_SETTING, 0, Player_PK::ms_bPK);
  391. break;
  392. case 5: //显示玩家名字
  393. if (g_pCoreShell)
  394. {
  395. g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_NAME, 0, 
  396. !g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_NAME, 0, 0));
  397. }
  398. break;
  399. case 6: //显示玩家生命
  400. if (g_pCoreShell)
  401. {
  402. g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_LIFE, 0, 
  403. !g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_LIFE, 0, 0));
  404. }
  405. break;
  406. case 7: //显示玩家内力
  407. if (g_pCoreShell)
  408. {
  409. g_pCoreShell->OperationRequest(GOI_SHOW_PLAYERS_MANA, 0, 
  410. !g_pCoreShell->GetGameData(GDI_SHOW_PLAYERS_MANA, 0, 0));
  411. }
  412. break;
  413. case 8: //界面显示玩家数字
  414. Player_Life::m_bText = !Player_Life::m_bText;
  415. Player_Mana::m_bText = !Player_Mana::m_bText;
  416. Player_Stamina::m_bText = !Player_Stamina::m_bText;
  417. Player_Exp::m_bText = !Player_Exp::m_bText;
  418. break;
  419. case 9:
  420. KUiPlayerBar::SwitchChannel();
  421. break;
  422. }
  423. }
  424. return 0;
  425. }
  426. int LuaSwitchChannel(Lua_State * L)
  427. {
  428. int nbUp = 0;
  429. if (Lua_GetTopIndex(L) == 1)
  430. {
  431. nbUp = (int)Lua_ValueToNumber(L, 1);
  432. }
  433. KUiPlayerBar::SwitchChannel(nbUp);
  434. return 0;
  435. }
  436. int LuaRegisterEvent(Lua_State * L)
  437. {
  438. if (Lua_GetTopIndex(L) == 2)
  439. {
  440. char * szName = (char *)Lua_ValueToString(L, 1);
  441. int hWnd = (int)Lua_ValueToNumber(L, 2);
  442. g_UiBase.RegisterEvent(szName, (HANDLE)hWnd);
  443. }
  444. return 0;
  445. }
  446. int LuaUnregisterEvent(Lua_State * L)
  447. {
  448. if (Lua_GetTopIndex(L) == 2)
  449. {
  450. char * szName = (char *)Lua_ValueToString(L, 1);
  451. int hWnd = (int)Lua_ValueToNumber(L, 2);
  452. g_UiBase.UnregisterEvent(szName, (HANDLE)hWnd);
  453. }
  454. return 0;
  455. }
  456. int LuaSendEvent(Lua_State * L)
  457. {
  458. if (Lua_GetTopIndex(L) == 2)
  459. {
  460. char * szName = (char *)Lua_ValueToString(L, 1);
  461. int nType = Lua_GetValueType(L, 2);
  462. char * szEvent = NULL;
  463. if (nType == LUA_TSTRING)
  464. szEvent = (char *)Lua_ValueToString(L, 2);
  465. else if (nType == LUA_TNUMBER)
  466. {
  467. int nNum = (int)Lua_ValueToNumber(L, 2);
  468. static char szNum[64];
  469. sprintf(szNum, "%d", nNum);
  470. szEvent = szNum;
  471. }
  472. if (szEvent)
  473. g_UiBase.NotifyOneEvent(szName, szEvent);
  474. }
  475. return 0;
  476. }
  477. extern  int g_bRepresent3;
  478. extern int g_bScreen;
  479. int LuaGetAppStatus(Lua_State * L)
  480. {
  481. int nRet = -1;
  482. if (Lua_GetTopIndex(L) == 1)
  483. {
  484. char * szName = (char *)Lua_ValueToString(L, 1);
  485. if (szName)
  486. {
  487. if (strcmpi(szName, "FullWindow") == 0)
  488. {
  489. nRet = g_bScreen ? 1 : 0;
  490. }
  491. else if (strcmpi(szName, "3D") == 0)
  492. {
  493. nRet = g_bRepresent3 ? 1 : 0;
  494. }
  495. else if (strcmpi(szName, "2D") == 0)
  496. {
  497. nRet = !g_bRepresent3 ? 1 : 0;
  498. }
  499. }
  500. }
  501. Lua_PushNumber(L, nRet);
  502. return 1;
  503. }
  504. namespace hotkey_str
  505. {
  506. std::string DescHotKey(DWORD hk)
  507. {
  508. static const char* modidesc_table[] = {
  509. // 0 1 2 3 4 5 6 7
  510. "Shift", "Ctrl", "Alt", "Ext", "", "", "", ""
  511. };
  512. static const char* vkeydesc_table[] = {
  513. // 0 1 2 3 4 5 6 7
  514. // 8 9 A B C D E F
  515. "", "LButton", "RButton", "Cancel", "MButton", "", "", "", //0
  516. "BackSpace","Tab", "", "", "Clear", "Enter", "", "",
  517. "", "", "", "Pause", "CapLock", "", "", "", //1
  518. "", "", "", "ESC", "Convert", "NonConvert","Accept", "ModeChange",
  519. "Space", "PageUp", "PageDown", "End", "Home", "Left", "Up", "Right", //2
  520. "Down", "Select", "Print", "Execute", "PrintScreen", "Insert", "Delete", "Help",
  521. "0", "1", "2", "3", "4", "5", "6", "7", //3
  522. "8", "9", "", "", "", "", "", "",
  523. "", "A", "B", "C", "D", "E", "F", "G", //4
  524. "H", "I", "J", "K", "L", "M", "N", "O",
  525. "P", "Q", "R", "S", "T", "U", "V", "W", //5
  526. "X", "Y", "Z", "Windows", "", "Menu", "", "",
  527. "Num0", "Num1", "Num2", "Num3", "Num4", "Num5", "Num6", "Num7", //6
  528. "Num8", "Num9", "Num*", "Num+", "Separator","Num-", "Num.", "Num/",
  529. "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", //7
  530. "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16",
  531. "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", //8
  532. "", "", "", "", "", "", "", "",
  533. "NumLock", "ScrollLock","", "", "", "", "", "", //9
  534. "", "", "", "", "", "", "", "",
  535. "", "", "", "", "", "", "", "", //A
  536. "", "", "", "", "", "", "", "",
  537. "", "", "", "", "", "", "", "", //B
  538. "", "", ";", "=", ",", "-", ".", "/",
  539. "`", "", "", "", "", "", "", "", //C
  540. "", "", "", "", "", "", "", "",
  541. "", "", "", "", "", "", "", "", //D
  542. "", "", "", "[", "\", "]", "'", "",
  543. "", "", "", "", "", "", "", "", //E
  544. "", "", "", "", "", "", "", "",
  545. "", "", "", "", "", "", "", "", //F
  546. "", "", "", "", "", "", "", "",
  547. "LDButton", "RDButton", "MDButton", "", "", "", "", "", //10
  548. "", "", "", "", "", "", "", "",
  549. };
  550. static const size_t count_moditbl = sizeof(modidesc_table) / sizeof(modidesc_table[0]);
  551. static const size_t count_vkeytbl = sizeof(vkeydesc_table) / sizeof(vkeydesc_table[0]);
  552. static const char STR_DELIMITER[] = " + ";
  553. static const size_t LEN_DELIMITER = sizeof(STR_DELIMITER) - sizeof(STR_DELIMITER[0]);
  554. const WORD modi = HIWORD(hk);
  555. const WORD vkey = LOWORD(hk);
  556. if ((modi & 0xFF00) || (vkey >= count_vkeytbl))
  557. return "";
  558. const char* szVkDesc = vkeydesc_table[vkey];
  559. if (!szVkDesc[0])
  560. return "";
  561. std::string desc;
  562. {{
  563. for (size_t pos = 0; pos <= count_moditbl; pos++)
  564. {
  565. const char* szDesc = NULL;
  566. if (pos < count_moditbl)
  567. {
  568. if (!(modi & (0x01 << pos)))
  569. continue;
  570. szDesc = modidesc_table[pos];
  571. if (!szDesc[0])
  572. return "";
  573. }
  574. else
  575. {
  576. szDesc = szVkDesc;
  577. }
  578. if (!desc.empty())
  579. desc += STR_DELIMITER;
  580. desc += szDesc;
  581. }
  582. }}
  583. return desc;
  584. }
  585. DWORD ParseHotKey(const std::string& desc)
  586. {
  587. static const struct PATTERNMAP
  588. {
  589. enum {MASK_VKEY = 0x0000FFFF};
  590. typedef std::pair<DWORD, DWORD> HOTKEYPART;
  591. typedef std::map<std::string, HOTKEYPART, string_iless> DESC2HKPMAP;
  592. DESC2HKPMAP theMap;
  593. PATTERNMAP()
  594. {
  595. const struct _PATTERN
  596. {
  597. char* desc;
  598. DWORD mask;
  599. DWORD value;
  600. } pattern_table[] = {
  601. //modifier
  602. {"Shift", HOTKEYF_SHIFT<<16, HOTKEYF_SHIFT<<16}, {"Control", HOTKEYF_CONTROL<<16, HOTKEYF_CONTROL<<16},
  603. {"Alt", HOTKEYF_ALT<<16, HOTKEYF_ALT<<16}, {"Ext", HOTKEYF_EXT<<16, HOTKEYF_EXT<<16},
  604. //vk
  605. {"LButton", MASK_VKEY, VK_LBUTTON}, {"RButton", MASK_VKEY, VK_RBUTTON},
  606. {"Cancel", MASK_VKEY, VK_CANCEL}, {"MButton", MASK_VKEY, VK_MBUTTON},
  607. {"BackSpace", MASK_VKEY, VK_BACK}, {"Tab", MASK_VKEY, VK_TAB}, {"Clear", MASK_VKEY, VK_CLEAR},
  608. {"Return", MASK_VKEY, VK_RETURN}, {"Pause", MASK_VKEY, VK_PAUSE},
  609. {"Convert", MASK_VKEY, VK_CONVERT}, {"NonConvert", MASK_VKEY, VK_NONCONVERT},
  610. {"Accept", MASK_VKEY, VK_ACCEPT}, {"ModeChange", MASK_VKEY, VK_MODECHANGE},
  611. {"Escape", MASK_VKEY, VK_ESCAPE}, {"Space", MASK_VKEY, VK_SPACE},
  612. {"Prior", MASK_VKEY, VK_PRIOR}, {"Next", MASK_VKEY, VK_NEXT}, {"End", MASK_VKEY, VK_END}, {"Home", MASK_VKEY, VK_HOME},
  613. {"Left", MASK_VKEY, VK_LEFT}, {"Up", MASK_VKEY, VK_UP}, {"Right", MASK_VKEY, VK_RIGHT}, {"Down", MASK_VKEY, VK_DOWN},
  614. {"Insert", MASK_VKEY, VK_INSERT}, {"Delete", MASK_VKEY, VK_DELETE},
  615. {"Select", MASK_VKEY, VK_SELECT}, {"Print", MASK_VKEY, VK_PRINT}, {"Execute", MASK_VKEY, VK_EXECUTE},
  616. {"SnapShot", MASK_VKEY, VK_SNAPSHOT}, {"Help", MASK_VKEY, VK_HELP},
  617. {"0", MASK_VKEY, '0'}, {"1", MASK_VKEY, '1'}, {"2", MASK_VKEY, '2'}, {"3", MASK_VKEY, '3'},
  618. {"4", MASK_VKEY, '4'}, {"5", MASK_VKEY, '5'}, {"6", MASK_VKEY, '6'}, {"7", MASK_VKEY, '7'},
  619. {"8", MASK_VKEY, '8'}, {"9", MASK_VKEY, '9'},
  620. {"A", MASK_VKEY, 'A'}, {"B", MASK_VKEY, 'B'}, {"C", MASK_VKEY, 'C'}, {"D", MASK_VKEY, 'D'},
  621. {"E", MASK_VKEY, 'E'}, {"F", MASK_VKEY, 'F'}, {"G", MASK_VKEY, 'G'}, {"H", MASK_VKEY, 'H'},
  622. {"I", MASK_VKEY, 'I'}, {"J", MASK_VKEY, 'J'}, {"K", MASK_VKEY, 'K'}, {"L", MASK_VKEY, 'L'},
  623. {"M", MASK_VKEY, 'M'}, {"N", MASK_VKEY, 'N'}, {"O", MASK_VKEY, 'O'}, {"P", MASK_VKEY, 'P'},
  624. {"Q", MASK_VKEY, 'Q'}, {"R", MASK_VKEY, 'R'}, {"S", MASK_VKEY, 'S'}, {"T", MASK_VKEY, 'T'},
  625. {"U", MASK_VKEY, 'U'}, {"V", MASK_VKEY, 'V'}, {"W", MASK_VKEY, 'W'}, {"X", MASK_VKEY, 'X'},
  626. {"Y", MASK_VKEY, 'Y'}, {"Z", MASK_VKEY, 'Z'},
  627. {"Num0", MASK_VKEY, VK_NUMPAD0}, {"Num1", MASK_VKEY, VK_NUMPAD1}, {"Num2", MASK_VKEY, VK_NUMPAD2}, {"Num3", MASK_VKEY, VK_NUMPAD3},
  628. {"Num4", MASK_VKEY, VK_NUMPAD4}, {"Num5", MASK_VKEY, VK_NUMPAD5}, {"Num6", MASK_VKEY, VK_NUMPAD6}, {"Num7", MASK_VKEY, VK_NUMPAD7},
  629. {"Num8", MASK_VKEY, VK_NUMPAD8}, {"Num9", MASK_VKEY, VK_NUMPAD9},
  630. {"Num+", MASK_VKEY, VK_ADD}, {"Num-", MASK_VKEY, VK_SUBTRACT}, {"Num*", MASK_VKEY, VK_MULTIPLY}, {"Num/", MASK_VKEY, VK_DIVIDE},
  631. {"Separator", MASK_VKEY, VK_SEPARATOR}, {"Num.", MASK_VKEY, VK_DECIMAL},
  632. {"F1", MASK_VKEY, VK_F1}, {"F2", MASK_VKEY, VK_F2}, {"F3", MASK_VKEY, VK_F3}, {"F4", MASK_VKEY, VK_F4},
  633. {"F5", MASK_VKEY, VK_F5}, {"F6", MASK_VKEY, VK_F6}, {"F7", MASK_VKEY, VK_F7}, {"F8", MASK_VKEY, VK_F8},
  634. {"F9", MASK_VKEY, VK_F9}, {"F10", MASK_VKEY, VK_F10}, {"F11", MASK_VKEY, VK_F11}, {"F12", MASK_VKEY, VK_F12},
  635. {"F13", MASK_VKEY, VK_F13}, {"F14", MASK_VKEY, VK_F14}, {"F15", MASK_VKEY, VK_F15}, {"F16", MASK_VKEY, VK_F16},
  636. {"F17", MASK_VKEY, VK_F17}, {"F18", MASK_VKEY, VK_F18}, {"F19", MASK_VKEY, VK_F19}, {"F20", MASK_VKEY, VK_F20},
  637. {"F21", MASK_VKEY, VK_F21}, {"F22", MASK_VKEY, VK_F22}, {"F23", MASK_VKEY, VK_F23}, {"F24", MASK_VKEY, VK_F24},
  638. {"CapLock", MASK_VKEY, VK_CAPITAL}, {"NumLock", MASK_VKEY, VK_NUMLOCK}, {"ScrollLock", MASK_VKEY, VK_SCROLL},
  639. {";", MASK_VKEY, 0x00BA}, {"=", MASK_VKEY, 0x00BB}, {",", MASK_VKEY, 0x00BC}, {"-", MASK_VKEY, 0x00BD},
  640. {".", MASK_VKEY, 0x00BE}, {"/", MASK_VKEY, 0x00BF}, {"`", MASK_VKEY, 0x00C0},
  641. {"[", MASK_VKEY, 0x00DB},
  642. {"\", MASK_VKEY, 0x00DC}, {"]", MASK_VKEY, 0x00DD}, {"'", MASK_VKEY, 0x00DE},
  643. //modifier alias
  644. {"Ctrl", HOTKEYF_CONTROL<<16, HOTKEYF_CONTROL<<16}, {"Menu", HOTKEYF_ALT<<16, HOTKEYF_ALT<<16},
  645. {"Break", MASK_VKEY, VK_PAUSE},
  646. //vk alias
  647. {"ESC", MASK_VKEY, VK_ESCAPE}, {"Enter", MASK_VKEY, VK_RETURN},
  648. {"BACK", MASK_VKEY, VK_BACK},
  649. {"INS", MASK_VKEY, VK_INSERT}, {"DEL", MASK_VKEY, VK_DELETE},
  650. {"PageUp", MASK_VKEY, VK_PRIOR}, {"PageDown", MASK_VKEY, VK_NEXT},
  651. {"ScrlLock", MASK_VKEY, VK_SCROLL},
  652. {"NumAdd", MASK_VKEY, VK_ADD}, {"NumSub", MASK_VKEY, VK_SUBTRACT}, {"NumMul", MASK_VKEY, VK_MULTIPLY}, {"NumDiv", MASK_VKEY, VK_DIVIDE},
  653. {"NumDecimal", MASK_VKEY, VK_DECIMAL},
  654. {"PrintScreen", MASK_VKEY, VK_SNAPSHOT},
  655. {"LDButton", MASK_VKEY, VK_LDBUTTON}, {"RDButton", MASK_VKEY, VK_RDBUTTON}, {"MDButton", MASK_VKEY, VK_MDBUTTON}, 
  656. };
  657. for (size_t i = 0; i < sizeof(pattern_table)/sizeof(pattern_table[0]); i++)
  658. {
  659. const _PATTERN& pat = pattern_table[i];
  660. theMap[std::string(pat.desc)] = std::make_pair(pat.mask, pat.value);
  661. }
  662. }
  663. } s_mapPattern;
  664. static const char CH_DELIMITER = '+';
  665. if (desc.empty())
  666. return 0;
  667. DWORD hkcode = 0;
  668. const char* szToken = desc.c_str(), * szLimit = NULL, * szNext = NULL;
  669. for ( ; *szToken; szToken = szNext)
  670. {
  671. for (szNext = NULL, szLimit = szToken; *szLimit; szLimit++)
  672. {
  673. if (*szLimit == CH_DELIMITER)
  674. {
  675. for (szNext = szLimit + 1; ; szNext++)
  676. {
  677. if (!*szNext)
  678. {
  679. szLimit ++;
  680. break;
  681. }
  682. if (*szNext == CH_DELIMITER)
  683. szLimit ++;
  684. else if (__x_isgraph(*szNext))
  685. break;
  686. }
  687. if (szLimit <= szToken)
  688. return 0;
  689. break;
  690. }
  691. }
  692. while (!__x_isgraph(*szToken))
  693. {
  694. szToken ++;
  695. if (szToken >= szLimit)
  696. return 0;
  697. }
  698. const char* pe = szLimit - 1;
  699. while (!__x_isgraph(*pe))
  700. pe --;
  701. size_t toklen = pe - szToken + 1;
  702. PATTERNMAP::DESC2HKPMAP::const_iterator it = s_mapPattern.theMap.find(std::string(szToken, toklen));
  703. if (it == s_mapPattern.theMap.end())
  704. return 0;
  705. const PATTERNMAP::HOTKEYPART& hkp = (*it).second;
  706. if (hkcode & hkp.first)
  707. return 0;
  708. hkcode |= hkp.second;
  709. if (szNext == NULL)
  710. break;
  711. }
  712. if (!(hkcode & PATTERNMAP::MASK_VKEY))
  713. return 0;
  714. return hkcode;
  715. }
  716. } //namespace hotkey_str
  717. int LuaAddCommand(Lua_State * L)
  718. {
  719. if (Lua_GetTopIndex(L) != 3)
  720. return 0;
  721. char * strUKey = (char *)Lua_ValueToString(L, 1);
  722. char * strName = (char *)Lua_ValueToString(L, 2);
  723. char * strDo = (char *)Lua_ValueToString(L, 3);
  724. COMMAND_SETTING cs;
  725. cs.uKey = hotkey_str::ParseHotKey(strUKey);
  726. strncpy(cs.szCommand, strName, 31);
  727. cs.szCommand[31] = 0;
  728. strncpy(cs.szDo, strDo, 127);
  729. cs.szDo[127] = 0;
  730. KShortcutKeyCentre::AddCommand(&cs);
  731. return 0;
  732. }
  733. int LuaRemoveCommand(Lua_State * L)
  734. {
  735. if (Lua_GetTopIndex(L) != 2)
  736. return 0;
  737. char * strUKey = (char *)Lua_ValueToString(L, 1);
  738. char * strName = (char *)Lua_ValueToString(L, 2);
  739. COMMAND_SETTING cs;
  740. cs.uKey = hotkey_str::ParseHotKey(strUKey);
  741. if (cs.uKey != 0)
  742. KShortcutKeyCentre::RemoveCommand(KShortcutKeyCentre::FindCommand(cs.uKey));
  743. else if (strName && strName[0] != 0)
  744. {
  745. strncpy(cs.szCommand, strName, 31);
  746. cs.szCommand[31] = 0;
  747. KShortcutKeyCentre::RemoveCommand(KShortcutKeyCentre::FindCommand(cs.szCommand));
  748. }
  749. else //清除所有命令
  750. {
  751. KShortcutKeyCentre::RemoveCommandAll();
  752. }
  753. return 0;
  754. }
  755. int LuaMakeFriend(Lua_State * L)
  756. {
  757. if (Lua_GetTopIndex(L) != 1)
  758. return 0;
  759. char * strName = (char *)Lua_ValueToString(L, 1);
  760. if (strName && strName[0] != 0)
  761. {
  762. KUiPlayerItem SelectPlayer;
  763. strncpy(SelectPlayer.Name, strName, 32);
  764. int nKind = -1;
  765. if (g_pCoreShell)
  766. {
  767. ProcessPeople(&SelectPlayer, ACTION_MAKEFRIEND);
  768. }
  769. }
  770. return 0;
  771. }
  772. int LuaCreateTeam(Lua_State * L)
  773. {
  774. if (g_pCoreShell)
  775. {
  776. g_pCoreShell->TeamOperation(TEAM_OI_CREATE, 0, 0);
  777. }
  778. return 0;
  779. }
  780. int LuaJoinTeam(Lua_State * L)
  781. {
  782. if (Lua_GetTopIndex(L) != 1)
  783. return 0;
  784. char * strName = (char *)Lua_ValueToString(L, 1);
  785. if (strName && strName[0] != 0)
  786. {
  787. KUiPlayerItem SelectPlayer;
  788. int nKind = -1;
  789. if (g_pCoreShell &&
  790. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  791. {
  792. ProcessPeople(&SelectPlayer, ACTION_JOINTEAM);
  793. }
  794. }
  795. return 0;
  796. }
  797. int LuaInviteTeam(Lua_State * L)
  798. {
  799. if (Lua_GetTopIndex(L) != 1)
  800. return 0;
  801. char * strName = (char *)Lua_ValueToString(L, 1);
  802. if (strName && strName[0] != 0)
  803. {
  804. KUiPlayerItem SelectPlayer;
  805. int nKind = -1;
  806. if (g_pCoreShell &&
  807. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  808. {
  809. ProcessPeople(&SelectPlayer, ACTION_INVITETEAM);
  810. }
  811. }
  812. return 0;
  813. }
  814. int LuaTrade(Lua_State * L)
  815. {
  816. if (Lua_GetTopIndex(L) != 1)
  817. return 0;
  818. char * strName = (char *)Lua_ValueToString(L, 1);
  819. if (strName && strName[0] != 0)
  820. {
  821. KUiPlayerItem SelectPlayer;
  822. int nKind = -1;
  823. if (g_pCoreShell &&
  824. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  825. {
  826. ProcessPeople(&SelectPlayer, ACTION_TRADE);
  827. }
  828. }
  829. return 0;
  830. }
  831. int LuaRevenge(Lua_State * L)
  832. {
  833. if (Lua_GetTopIndex(L) != 1)
  834. return 0;
  835. char * strName = (char *)Lua_ValueToString(L, 1);
  836. if (strName && strName[0] != 0)
  837. {
  838. KUiPlayerItem SelectPlayer;
  839. int nKind = -1;
  840. if (g_pCoreShell &&
  841. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  842. {
  843. ProcessPeople(&SelectPlayer, ACTION_REVENGE);
  844. }
  845. }
  846. return 0;
  847. }
  848. int LuaFollow(Lua_State * L)
  849. {
  850. if (Lua_GetTopIndex(L) != 1)
  851. return 0;
  852. char * strName = (char *)Lua_ValueToString(L, 1);
  853. if (strName && strName[0] != 0)
  854. {
  855. KUiPlayerItem SelectPlayer;
  856. int nKind = -1;
  857. if (g_pCoreShell &&
  858. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  859. {
  860. ProcessPeople(&SelectPlayer, ACTION_FOLLOW);
  861. }
  862. }
  863. return 0;
  864. }
  865. int LuaViewItem(Lua_State * L)
  866. {
  867. if (Lua_GetTopIndex(L) != 1)
  868. return 0;
  869. char * strName = (char *)Lua_ValueToString(L, 1);
  870. if (strName && strName[0] != 0)
  871. {
  872. KUiPlayerItem SelectPlayer;
  873. int nKind = -1;
  874. if (g_pCoreShell &&
  875. g_pCoreShell->FindSpecialNPC(strName, &SelectPlayer, nKind) && nKind == kind_player)
  876. {
  877. ProcessPeople(&SelectPlayer, ACTION_VIEWITEM);
  878. }
  879. }
  880. return 0;
  881. }
  882. int LuaPrintScreen(Lua_State * L)
  883. {
  884. SaveScreenToFile();
  885. return 0;
  886. }
  887. int LuaClearMessage(Lua_State * L)
  888. {
  889. KUiMsgCentrePad::Clear();
  890. return 0;
  891. }
  892. #include "../../Engine/src/Text.h"
  893. int LuaSay(Lua_State * L)
  894. {
  895. if (Lua_GetTopIndex(L) != 2)
  896. return 0;
  897. char * strName = (char *)Lua_ValueToString(L, 1);
  898. char * strMessage = (char *)Lua_ValueToString(L, 2);
  899. int nLen = strlen(strMessage);
  900. if (strName && strName[0] != 0 && !KUiPlayerBar::IsSelfName(strName))
  901. {
  902. if (KUiPlayerBar::IsCanSendMessage(strMessage, nLen, strName, -1))
  903. {
  904. char Buffer[1536];
  905. nLen = KUiFaceSelector::ConvertFaceText(Buffer, strMessage, nLen);
  906. nLen = TEncodeText(Buffer, nLen);
  907. KUiPlayerBar::OnSendSomeoneMessage(strName, Buffer, nLen);
  908. }
  909. }
  910. return 0;
  911. }
  912. int LuaChat(Lua_State * L)
  913. {
  914. if (Lua_GetTopIndex(L) != 2)
  915. return 0;
  916. char * strChannelName = (char *)Lua_ValueToString(L, 1);
  917. char * strMessage = (char *)Lua_ValueToString(L, 2);
  918. int nLen = strlen(strMessage);
  919. if (strChannelName && strChannelName[0] != 0)
  920. {
  921. int nIndex = KUiMsgCentrePad::GetChannelIndex(strChannelName);
  922. DWORD nChannelID = KUiMsgCentrePad::GetChannelID(nIndex);
  923. if (nChannelID != -1)
  924. {
  925. if (KUiPlayerBar::IsCanSendMessage(strMessage, nLen, strChannelName, nChannelID))
  926. {
  927. char Buffer[1536];
  928. nLen = KUiFaceSelector::ConvertFaceText(Buffer, strMessage, nLen);
  929. nLen = TEncodeText(Buffer, nLen);
  930. KUiMsgCentrePad::CheckChannel(nIndex, true);
  931. KUiPlayerBar::OnSendChannelMessage(nChannelID, Buffer, nLen);
  932. }
  933. }
  934. }
  935. return 0;
  936. }
  937. int LuaRegisterFunctionAlias(Lua_State * L)
  938. {
  939. int nCount = Lua_GetTopIndex(L);
  940. if (nCount < 2)
  941. return 0;
  942. char * strFunAlias = (char *)Lua_ValueToString(L, 1);
  943. char * strFun = (char *)Lua_ValueToString(L, 2);
  944. int nParam = 0;
  945. if (nCount >= 3)
  946. {
  947. nParam = (int)Lua_ValueToNumber(L, 3);
  948. }
  949. PARAMLIST List;
  950. for(int i = 4; i <= nCount; i++)
  951. {
  952. char* sDefault = (char *)Lua_ValueToString(L, i);
  953. if (sDefault == NULL || sDefault[0] == 0)
  954. List.push_back("""");
  955. else
  956. List.push_back(sDefault);
  957. }
  958. KShortcutKeyCentre::RegisterFunctionAlias(strFunAlias, strFun, nParam, List);
  959. return 0;
  960. }
  961. #include "UiChatPhrase.h"
  962. extern KUiChatPhrase g_UiChatPhrase;
  963. int LuaSayPhrase(Lua_State * L)
  964. {
  965. if (Lua_GetTopIndex(L) != 1)
  966. return 0;
  967. int nIndex = (int)Lua_ValueToNumber(L, 1);
  968. char szPhrase[64];
  969. int nLen = g_UiChatPhrase.GetPhrase(nIndex, szPhrase);
  970. if (nLen > 0)
  971. {
  972. DWORD nChannelID = -1;
  973. //附近玩家
  974. int nChannelDataCount = KUiMsgCentrePad::GetChannelCount();
  975. for (int n = 0; n < nChannelDataCount; n++)
  976. {
  977. if (KUiMsgCentrePad::IsChannelType(n, KUiMsgCentrePad::ch_Screen))
  978. {
  979. nChannelID = KUiMsgCentrePad::GetChannelID(n);
  980. break;
  981. }
  982. }
  983. if (nChannelID != -1)
  984. {
  985. if (KUiPlayerBar::IsCanSendMessage(szPhrase, nLen, KUiMsgCentrePad::GetChannelTitle(KUiMsgCentrePad::GetChannelIndex(nChannelID)), nChannelID))
  986. {
  987. char Buffer[1536];
  988. nLen = KUiFaceSelector::ConvertFaceText(Buffer, szPhrase, nLen);
  989. nLen = TEncodeText(Buffer, nLen);
  990. KUiMsgCentrePad::CheckChannel(n, true);
  991. KUiPlayerBar::OnSendChannelMessage(nChannelID, Buffer, nLen);
  992. }
  993. }
  994. }
  995. return 0;
  996. }
  997. int LuaSayEmote(Lua_State * L)
  998. {
  999. char *pszDestName, *pszDestChannel;
  1000. int  nEmoteIndex;
  1001. if (Lua_GetTopIndex(L) != 3)
  1002. return 0;
  1003. nEmoteIndex = (int)Lua_ValueToNumber(L, 3);
  1004. pszDestName   = (char *)Lua_ValueToString(L, 1);
  1005. pszDestChannel  = (char *)Lua_ValueToString(L, 2);
  1006.     ProcessEmote(pszDestName, pszDestChannel, nEmoteIndex);
  1007. return 0;
  1008. }
  1009. int LuaGetCurrentChannelName(Lua_State * L)
  1010. {
  1011. int nCurChannel = KUiPlayerBar::GetCurChannel();
  1012. if(nCurChannel >= 0 && nCurChannel < KUiMsgCentrePad::GetChannelCount())
  1013. {
  1014. Lua_PushString(L, KUiMsgCentrePad::GetChannelTitle(nCurChannel));
  1015. }
  1016. else
  1017. {
  1018. Lua_PushString(L, "");
  1019. }
  1020. return 1;
  1021. }
  1022. int LuaGetRecentPlayerName(Lua_State * L)
  1023. {
  1024. int nCurChannel = KUiPlayerBar::GetCurChannel();
  1025. if(nCurChannel >= KUiMsgCentrePad::GetChannelCount())
  1026. {
  1027. Lua_PushString(L, KUiPlayerBar::GetRecentPlayerName(nCurChannel));
  1028. }
  1029. else
  1030. {
  1031. Lua_PushString(L, "");
  1032. }
  1033. return 1;
  1034. }
  1035. int LuaConvertEmotes(Lua_State * L)
  1036. {
  1037. g_UiChatPhrase.ConstructFunctionAlias();
  1038. return 0;
  1039. }
  1040. int LuaSetEmote(Lua_State *L)
  1041. {
  1042.     int nIndex = -1, nParamCount = Lua_GetTopIndex(L);
  1043. char *pszCmd, *pszName, *pszStringTarget, *pszStringSelf;
  1044. switch(nParamCount)
  1045. {
  1046. case 5:
  1047. nIndex = (int)Lua_ValueToNumber(L, 5);
  1048. case 4:
  1049. pszCmd = (char *)Lua_ValueToString(L, 1);
  1050. pszName = (char *)Lua_ValueToString(L, 2);
  1051. pszStringSelf = (char *)Lua_ValueToString(L, 4);
  1052. pszStringTarget = (char *)Lua_ValueToString(L, 3);
  1053. break;
  1054. default:
  1055. return 0;
  1056. }
  1057. g_UiChatPhrase.SetEmote(pszCmd, pszName, pszStringTarget, pszStringSelf, nIndex);
  1058. return 0;
  1059. }
  1060. int LuaSetScreenShotFolder(Lua_State * L)
  1061. {
  1062. if(Lua_GetTopIndex(L) == 1)
  1063. {
  1064. char *pszFolder = (char *)Lua_ValueToString(L, 1);
  1065. char szPath[256], Buff[128];
  1066. if(pszFolder[0] == '$' && pszFolder[1] == '\')
  1067. {
  1068. g_GetRootPath(Buff);
  1069. sprintf(szPath, "%s\%s", Buff, pszFolder + 2);
  1070. }
  1071. else
  1072. {
  1073. memcpy(szPath, pszFolder, strlen(pszFolder) + 1);
  1074. }
  1075. SetScrPicPath(szPath);
  1076. }
  1077. return 0;
  1078. }
  1079. int LuaSetPhrase(Lua_State * L)
  1080. {
  1081. if (Lua_GetTopIndex(L) != 2)
  1082. return 0;
  1083. int nIndex = (int)Lua_ValueToNumber(L, 1);
  1084. char * strPhrase = (char *)Lua_ValueToString(L, 2);
  1085. int nLen = strlen(strPhrase);
  1086. if (nIndex >= 0 && nIndex < g_UiChatPhrase.GetPhraseCount())
  1087. {
  1088. g_UiChatPhrase.SetPhrase(nIndex, strPhrase, nLen);
  1089. }
  1090. return 0;
  1091. }
  1092. #include "../Login/Login.h"
  1093. #include "UiCase/UiInit.h"
  1094. int LuaExitGame(Lua_State * L)
  1095. {
  1096. if (KUiESCDlg::GetIfVisible())
  1097. KUiESCDlg::CloseWindow(false);
  1098. if (g_pCoreShell)
  1099. g_pCoreShell->OperationRequest(GOI_EXIT_GAME, 0, 0);
  1100. g_LoginLogic.ReturnToIdle();
  1101. UiEndGame();
  1102. KUiInit::OpenWindow(true, false);
  1103. return 0;
  1104. }
  1105. int LuaExit(Lua_State * L)
  1106. {
  1107. UiPostQuitMsg();
  1108. return 0;
  1109. }
  1110. #define GAME_CONFIG_STRING_INI "\Ui\杂烩.ini"
  1111. int LuaSet3D(Lua_State * L)
  1112. {
  1113. if (Lua_GetTopIndex(L) != 1)
  1114. return 0;
  1115. KIniFile Ini, IniString;
  1116. KSystemMessage Msg;
  1117. int nBool = (int)Lua_ValueToNumber(L, 1);
  1118. Msg.eType = SMT_NORMAL;
  1119. Msg.byConfirmType = SMCT_NONE;
  1120. Msg.byPriority = 0;
  1121. Msg.byParamSize = 0;
  1122. Ini.Load(GAME_CONFIG_FILE);
  1123. IniString.Load(GAME_CONFIG_STRING_INI);
  1124. if (nBool)
  1125. {
  1126. IniString.GetString("Config", "3D", "游戏设为3D模式,重新启动游戏后生效。", Msg.szMessage, sizeof(Msg.szMessage));
  1127. Ini.WriteInteger("Client", "Represent", SCREEN_MODE_3D);
  1128. }
  1129. else
  1130. {
  1131. IniString.GetString("Config", "2D", "游戏设为2D模式,重新启动游戏后生效。", Msg.szMessage, sizeof(Msg.szMessage));
  1132. Ini.WriteInteger("Client", "Represent", SCREEN_MODE_2D);
  1133. }
  1134. KUiSysMsgCentre::AMessageArrival(&Msg, NULL);
  1135. Ini.Save(GAME_CONFIG_FILE);
  1136. return 0;
  1137. }
  1138. int LuaSetFullWindow(Lua_State * L)
  1139. {
  1140. if (Lua_GetTopIndex(L) != 1)
  1141. return 0;
  1142. KIniFile Ini, IniString;
  1143. KSystemMessage Msg;
  1144. int nBool = (int)Lua_ValueToNumber(L, 1);
  1145. Msg.eType = SMT_NORMAL;
  1146. Msg.byConfirmType = SMCT_NONE;
  1147. Msg.byPriority = 0;
  1148. Msg.byParamSize = 0;
  1149. Ini.Load(GAME_CONFIG_FILE);
  1150. IniString.Load(GAME_CONFIG_STRING_INI);
  1151. if (nBool)
  1152. {
  1153. IniString.GetString("Config", "FullWindow", "游戏设定改变为全屏运行,将在下次启动游戏的时候生效。", Msg.szMessage, sizeof(Msg.szMessage));
  1154. Ini.WriteInteger("Client", "FullScreen", 1);
  1155. }
  1156. else
  1157. {
  1158. IniString.GetString("Config", "Window", "游戏设定改变为窗口运行,将在下次启动游戏的时候生效。", Msg.szMessage, sizeof(Msg.szMessage));
  1159. Ini.WriteInteger("Client", "FullScreen", 0);
  1160. }
  1161. KUiSysMsgCentre::AMessageArrival(&Msg, NULL);
  1162. Ini.Save(GAME_CONFIG_FILE);
  1163. return 0;
  1164. }
  1165. int LuaMoveTo(Lua_State * L)
  1166. {
  1167. if (Lua_GetTopIndex(L) != 2)
  1168. return 0;
  1169. int nDir = (int)Lua_ValueToNumber(L, 1);
  1170. int nM = (int)Lua_ValueToNumber(L, 2);
  1171. if (nDir < 0)
  1172. nDir = 0;
  1173. if (nDir > 63)
  1174. nDir = 63;
  1175. if (nM < 0)
  1176. nM = 0;
  1177. if (nM > 2)
  1178. nM = 2;
  1179. if (g_pCoreShell)
  1180. g_pCoreShell->Goto(nDir, nM);
  1181. return 0;
  1182. }
  1183. int LuaTurnTo(Lua_State * L)
  1184. {
  1185. if (Lua_GetTopIndex(L) != 1)
  1186. return 0;
  1187. int nDir = (int)Lua_ValueToNumber(L, 1);
  1188. if (nDir < 0)
  1189. nDir = 0;
  1190. if (nDir > 2)
  1191. nDir = 2;
  1192. if (g_pCoreShell)
  1193. g_pCoreShell->Turn(nDir);
  1194. return 0;
  1195. }
  1196. int Mouse_Action(Lua_State * L)
  1197. {
  1198. if (!KShortcutKeyCentre::ms_bMouse)
  1199. return 0;
  1200. if (g_pCoreShell == NULL)
  1201. return 0;
  1202. if (g_pCoreShell->ThrowAwayItem()) //先扔掉手里的物品
  1203. return 0;
  1204. KUiPlayerItem SelectPlayer;
  1205. int nNPCKind = -1;
  1206. if (g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_all, false, &SelectPlayer, nNPCKind))
  1207. {
  1208. int nRelation = g_pCoreShell->GetNPCRelation(SelectPlayer.nIndex);
  1209. if (nRelation == relation_enemy)
  1210. {
  1211. KUiPlayerImmedItemSkill immedItemSkillInfo;
  1212. memset(&immedItemSkillInfo, 0, sizeof(KUiPlayerImmedItemSkill));
  1213. g_pCoreShell->GetGameData(GDI_PLAYER_IMMED_ITEMSKILL, (int)&immedItemSkillInfo, 0);
  1214. if (!g_pCoreShell->LockSomeoneUseSkill(SelectPlayer.nIndex, immedItemSkillInfo.IMmediaSkill[0].uId)) //锁定失败
  1215. g_pCoreShell->LockSomeoneAction(0); //解锁
  1216. }
  1217. else if (nRelation == relation_dialog)
  1218. {
  1219. g_pCoreShell->LockSomeoneAction(SelectPlayer.nIndex);
  1220. }
  1221. }
  1222. else
  1223. g_pCoreShell->LockSomeoneAction(0);
  1224. int nObjKind = -1;
  1225. int nObjectIdx = 0;
  1226. if (g_pCoreShell->FindSelectObject(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, false, nObjectIdx, nObjKind))
  1227. {
  1228. g_pCoreShell->LockObjectAction(nObjectIdx);
  1229. }
  1230. else
  1231. g_pCoreShell->LockObjectAction(0);
  1232. g_pCoreShell->GotoWhere(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, 0);
  1233. return 0;
  1234. }
  1235. int Mouse_Force0(Lua_State * L)
  1236. {
  1237. if (!KShortcutKeyCentre::ms_bMouse)
  1238. return 0;
  1239. if (g_pCoreShell == NULL)
  1240. return 0;
  1241. if (g_pCoreShell->ThrowAwayItem()) //先扔掉手里的物品
  1242. return 0;
  1243. KUiPlayerImmedItemSkill immedItemSkillInfo;
  1244. memset(&immedItemSkillInfo, 0, sizeof(KUiPlayerImmedItemSkill));
  1245. g_pCoreShell->GetGameData(GDI_PLAYER_IMMED_ITEMSKILL, (int)&immedItemSkillInfo, 0);
  1246. g_pCoreShell->UseSkill(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, immedItemSkillInfo.IMmediaSkill[0].uId);
  1247. return 0;
  1248. }
  1249. int Mouse_Force1(Lua_State * L)
  1250. {
  1251. if (!KShortcutKeyCentre::ms_bMouse)
  1252. return 0;
  1253. if (g_pCoreShell == NULL)
  1254. return 0;
  1255. if (g_pCoreShell->ThrowAwayItem()) //先扔掉手里的物品
  1256. return 0;
  1257. KUiPlayerImmedItemSkill immedItemSkillInfo;
  1258. memset(&immedItemSkillInfo, 0, sizeof(KUiPlayerImmedItemSkill));
  1259. g_pCoreShell->GetGameData(GDI_PLAYER_IMMED_ITEMSKILL, (int)&immedItemSkillInfo, 0);
  1260. g_pCoreShell->UseSkill(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, immedItemSkillInfo.IMmediaSkill[1].uId);
  1261. return 0;
  1262. }
  1263. int Mouse_MoveTo(Lua_State * L)
  1264. {
  1265. if (!KShortcutKeyCentre::ms_bMouse)
  1266. return 0;
  1267. if (g_pCoreShell == NULL)
  1268. return 0;
  1269. if (Lua_GetTopIndex(L) != 1)
  1270. return 0;
  1271. int nM = (int)Lua_ValueToNumber(L, 1);
  1272. if (nM < 0)
  1273. nM = 0;
  1274. if (nM > 2)
  1275. nM = 2;
  1276. g_pCoreShell->GotoWhere(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, nM);
  1277. return 0;
  1278. }
  1279. int Mouse_Menu(Lua_State * L)
  1280. {
  1281. if (!KShortcutKeyCentre::ms_bMouse)
  1282. return 0;
  1283. if (g_pCoreShell == NULL)
  1284. return 0;
  1285. KUiPlayerItem SelectPlayer;
  1286. int nKind = -1;
  1287. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1288.  && kind_player == nKind))
  1289. return 0;
  1290. PopUpContextPeopleMenu(SelectPlayer, KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY);
  1291. return 0;
  1292. }
  1293. int Mouse_Emote_Menu(Lua_State * L)
  1294. {
  1295. if (!KShortcutKeyCentre::ms_bMouse)
  1296. return 0;
  1297. if (g_pCoreShell == NULL)
  1298. return 0;
  1299. KUiPlayerItem SelectPlayer;
  1300. int nKind = -1;
  1301. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1302.  && kind_player == nKind))
  1303. return 0;
  1304. PopUpContextEmoteMenu(SelectPlayer.Name, KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY);
  1305. return 0;
  1306. }
  1307. int Mouse_Say(Lua_State * L)
  1308. {
  1309. if (!KShortcutKeyCentre::ms_bMouse)
  1310. return 0;
  1311. if (g_pCoreShell == NULL)
  1312. return 0;
  1313. KUiPlayerItem SelectPlayer;
  1314. int nKind = -1;
  1315. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1316.  && kind_player == nKind))
  1317. return 0;
  1318. ProcessPeople(&SelectPlayer, ACTION_CHAT);
  1319. return 0;
  1320. }
  1321. int Mouse_MakeFriend(Lua_State * L)
  1322. {
  1323. if (!KShortcutKeyCentre::ms_bMouse)
  1324. return 0;
  1325. if (g_pCoreShell == NULL)
  1326. return 0;
  1327. KUiPlayerItem SelectPlayer;
  1328. int nKind = -1;
  1329. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1330.  && kind_player == nKind))
  1331. return 0;
  1332. ProcessPeople(&SelectPlayer, ACTION_MAKEFRIEND);
  1333. return 0;
  1334. }
  1335. int Mouse_JoinTeam(Lua_State * L)
  1336. {
  1337. if (!KShortcutKeyCentre::ms_bMouse)
  1338. return 0;
  1339. if (g_pCoreShell == NULL)
  1340. return 0;
  1341. KUiPlayerItem SelectPlayer;
  1342. int nKind = -1;
  1343. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1344.  && kind_player == nKind))
  1345. return 0;
  1346. ProcessPeople(&SelectPlayer, ACTION_JOINTEAM);
  1347. return 0;
  1348. }
  1349. int Mouse_InviteTeam(Lua_State * L)
  1350. {
  1351. if (!KShortcutKeyCentre::ms_bMouse)
  1352. return 0;
  1353. if (g_pCoreShell == NULL)
  1354. return 0;
  1355. KUiPlayerItem SelectPlayer;
  1356. int nKind = -1;
  1357. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1358.  && kind_player == nKind))
  1359. return 0;
  1360. ProcessPeople(&SelectPlayer, ACTION_INVITETEAM);
  1361. return 0;
  1362. }
  1363. int Mouse_Trade(Lua_State * L)
  1364. {
  1365. if (!KShortcutKeyCentre::ms_bMouse)
  1366. return 0;
  1367. if (g_pCoreShell == NULL)
  1368. return 0;
  1369. KUiPlayerItem SelectPlayer;
  1370. int nKind = -1;
  1371. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1372.  && kind_player == nKind))
  1373. return 0;
  1374. ProcessPeople(&SelectPlayer, ACTION_TRADE);
  1375. return 0;
  1376. }
  1377. int Mouse_Revenge(Lua_State * L)
  1378. {
  1379. if (!KShortcutKeyCentre::ms_bMouse)
  1380. return 0;
  1381. if (g_pCoreShell == NULL)
  1382. return 0;
  1383. KUiPlayerItem SelectPlayer;
  1384. int nKind = -1;
  1385. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1386.  && kind_player == nKind))
  1387. return 0;
  1388. ProcessPeople(&SelectPlayer, ACTION_REVENGE);
  1389. return 0;
  1390. }
  1391. int Mouse_Follow(Lua_State * L)
  1392. {
  1393. if (!KShortcutKeyCentre::ms_bMouse)
  1394. return 0;
  1395. if (g_pCoreShell == NULL)
  1396. return 0;
  1397. KUiPlayerItem SelectPlayer;
  1398. int nKind = -1;
  1399. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1400.  && kind_player == nKind))
  1401. return 0;
  1402. ProcessPeople(&SelectPlayer, ACTION_FOLLOW);
  1403. return 0;
  1404. }
  1405. int Mouse_ViewItem(Lua_State * L)
  1406. {
  1407. if (!KShortcutKeyCentre::ms_bMouse)
  1408. return 0;
  1409. if (g_pCoreShell == NULL)
  1410. return 0;
  1411. KUiPlayerItem SelectPlayer;
  1412. int nKind = -1;
  1413. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1414.  && kind_player == nKind))
  1415. return 0;
  1416. ProcessPeople(&SelectPlayer, ACTION_VIEWITEM);
  1417. return 0;
  1418. }
  1419. int Mouse_BlackList(Lua_State * L)
  1420. {
  1421. if (!KShortcutKeyCentre::ms_bMouse)
  1422. return 0;
  1423. if (g_pCoreShell == NULL)
  1424. return 0;
  1425. KUiPlayerItem SelectPlayer;
  1426. int nKind = -1;
  1427. if (!(g_pCoreShell->FindSelectNPC(KShortcutKeyCentre::ms_MouseX, KShortcutKeyCentre::ms_MouseY, relation_none | relation_ally | relation_enemy, false, &SelectPlayer, nKind)
  1428.  && kind_player == nKind))
  1429. return 0;
  1430. ProcessPeople(&SelectPlayer, ACTION_BLACKLIST);
  1431. return 0;
  1432. }
  1433. int LuaThrowAwayItem(Lua_State * L)
  1434. {
  1435. if (g_pCoreShell == NULL)
  1436. return 0;
  1437. g_pCoreShell->ThrowAwayItem();
  1438. return 0;
  1439. }
  1440. int LuaSetChatFontSzie(Lua_State * L)
  1441. {
  1442. if (Lua_GetTopIndex(L) != 1)
  1443. return 0;
  1444. int nF = (int)Lua_ValueToNumber(L, 1);
  1445. KUiMsgCentrePad::SetFontSize(nF);
  1446. return 0;
  1447. }
  1448. int LuaSetChannelTextColor(Lua_State * L)
  1449. {
  1450. if (Lua_GetTopIndex(L) != 3)
  1451. return 0;
  1452. char * strName = (char *)Lua_ValueToString(L, 1);
  1453. char * strColor = (char *)Lua_ValueToString(L, 2);
  1454. char * strBColor = (char *)Lua_ValueToString(L, 3);
  1455. if (strName && strColor)
  1456. {
  1457. KUiMsgCentrePad::SetChannelTextColor(strName, GetColor(strColor), GetColor(strBColor));
  1458. }
  1459. return 0;
  1460. }
  1461. int LuaSetMeTextColor(Lua_State * L)
  1462. {
  1463. if (Lua_GetTopIndex(L) != 2)
  1464. return 0;
  1465. char * strColor = (char *)Lua_ValueToString(L, 1);
  1466. char * strBColor = (char *)Lua_ValueToString(L, 2);
  1467. if (strColor)
  1468. {
  1469. KUiMsgCentrePad::SetMSNTextColor(0, GetColor(strColor), GetColor(strBColor));
  1470. }
  1471. return 0;
  1472. }
  1473. int LuaSetFriendTextColor(Lua_State * L)
  1474. {
  1475. if (Lua_GetTopIndex(L) != 2)
  1476. return 0;
  1477. char * strColor = (char *)Lua_ValueToString(L, 1);
  1478. char * strBColor = (char *)Lua_ValueToString(L, 2);
  1479. if (strColor)
  1480. {
  1481. KUiMsgCentrePad::SetMSNTextColor(1, GetColor(strColor), GetColor(strBColor));
  1482. }
  1483. return 0;
  1484. }
  1485. int LuaSetStrangerTextColor(Lua_State * L)
  1486. {
  1487. if (Lua_GetTopIndex(L) != 2)
  1488. return 0;
  1489. char * strColor = (char *)Lua_ValueToString(L, 1);
  1490. char * strBColor = (char *)Lua_ValueToString(L, 2);
  1491. if (strColor)
  1492. {
  1493. KUiMsgCentrePad::SetMSNTextColor(2, GetColor(strColor), GetColor(strBColor));
  1494. }
  1495. return 0;
  1496. }
  1497. extern int WND_SHOW_MOUSE_OVER_WND;
  1498. int LuaDebug(Lua_State * L)
  1499. {
  1500. if (Lua_GetTopIndex(L) != 1)
  1501. return 0;
  1502. char * strMode = (char *)Lua_ValueToString(L, 1);
  1503. if (strcmpi(strMode, "ShowMouseWnd") == 0)
  1504. {
  1505. WND_SHOW_MOUSE_OVER_WND = !WND_SHOW_MOUSE_OVER_WND;
  1506. }
  1507. return 0;
  1508. }
  1509. void AddBlackList(const char* strName, const char* strGroup);
  1510. int LuaAddBlackList(Lua_State * L)
  1511. {
  1512. if (Lua_GetTopIndex(L) != 1 && Lua_GetTopIndex(L) != 2)
  1513. return 0;
  1514. char * strName = (char *)Lua_ValueToString(L, 1);
  1515. char * strGroup = (char *)Lua_ValueToString(L, 2);
  1516. std::string group;
  1517. if (strGroup)
  1518. group = strGroup;
  1519. AddBlackList(strName, group.c_str());
  1520. return 0;
  1521. }
  1522. void RemoveBlackList(char* strName);
  1523. void ClearBlackList();
  1524. int LuaRemoveBlackList(Lua_State * L)
  1525. {
  1526. if (Lua_GetTopIndex(L) != 1)
  1527. return 0;
  1528. char * strName = (char *)Lua_ValueToString(L, 1);
  1529. if (strName == NULL || strName[0] == 0)
  1530. ClearBlackList();
  1531. else
  1532. RemoveBlackList(strName);
  1533. return 0;
  1534. }
  1535. void CreateAddinUnit(const char* UnitName);
  1536. int LuaCreateAddinUnit(Lua_State * L)
  1537. {
  1538. if (Lua_GetTopIndex(L) != 1)
  1539. return 0;
  1540. char * strName = (char *)Lua_ValueToString(L, 1);
  1541. CreateAddinUnit(strName);
  1542. return 0;
  1543. }
  1544. void DeleteAddinUnit(const char* UnitName);
  1545. int LuaDeleteAddinUnit(Lua_State * L)
  1546. {
  1547. if (Lua_GetTopIndex(L) != 1)
  1548. return 0;
  1549. char * strName = (char *)Lua_ValueToString(L, 1);
  1550. DeleteAddinUnit(strName);
  1551. return 0;
  1552. }
  1553. int LuaCreateUnitGroup(Lua_State * L)
  1554. {
  1555. if (Lua_GetTopIndex(L) != 2)
  1556. return 0;
  1557. char * strName = (char *)Lua_ValueToString(L, 1);
  1558. char * strGroup = (char *)Lua_ValueToString(L, 2);
  1559. int nUint = KUiChatCentre::FindUnitIndex(strName);
  1560. if (nUint >= 0)
  1561. {
  1562. KUiChatCentre::NewGroup(nUint, strGroup);
  1563. }
  1564. return 0;
  1565. }
  1566. int LuaRenameUnitGroup(Lua_State * L)
  1567. {
  1568. if (Lua_GetTopIndex(L) != 3)
  1569. return 0;
  1570. char * strName = (char *)Lua_ValueToString(L, 1);
  1571. char * strGroup = (char *)Lua_ValueToString(L, 2);
  1572. char * strNewGroup = (char *)Lua_ValueToString(L, 3);
  1573. int nUint = KUiChatCentre::FindUnitIndex(strName);
  1574. if (nUint >= 0)
  1575. {
  1576. KUiChatCentre::ReplaceGroupName(nUint, strGroup, strNewGroup);
  1577. }
  1578. return 0;
  1579. }
  1580. int LuaMoveUnitGroup(Lua_State * L)
  1581. {
  1582. if (Lua_GetTopIndex(L) != 3)
  1583. return 0;
  1584. char * strName = (char *)Lua_ValueToString(L, 1);
  1585. char * strGroup = (char *)Lua_ValueToString(L, 2);
  1586. char * strNewGroup = (char *)Lua_ValueToString(L, 3);
  1587. int nUint = KUiChatCentre::FindUnitIndex(strName);
  1588. if (nUint >= 0)
  1589. {
  1590. KUiChatCentre::MoveGroupToGroup(nUint, strGroup, strNewGroup, false);
  1591. }
  1592. return 0;
  1593. }
  1594. int LuaDeleteUnitGroup(Lua_State * L)
  1595. {
  1596. if (Lua_GetTopIndex(L) != 2)
  1597. return 0;
  1598. char * strName = (char *)Lua_ValueToString(L, 1);
  1599. char * strGroup = (char *)Lua_ValueToString(L, 2);
  1600. int nUint = KUiChatCentre::FindUnitIndex(strName);
  1601. if (nUint >= 0)
  1602. {
  1603. KUiChatCentre::MoveGroupToGroup(nUint, strGroup, "", true);
  1604. }
  1605. return 0;
  1606. }
  1607. int LuaMoveUnitMember(Lua_State * L)
  1608. {
  1609. if (Lua_GetTopIndex(L) != 3)
  1610. return 0;
  1611. char * strName = (char *)Lua_ValueToString(L, 1);
  1612. char * strMember = (char *)Lua_ValueToString(L, 2);
  1613. char * strGroup = (char *)Lua_ValueToString(L, 3);
  1614. int nUint = KUiChatCentre::FindUnitIndex(strName);
  1615. if (nUint >= 0)
  1616. {
  1617. KUiChatCentre::MoveFriendToGroup(nUint, strMember, strGroup);
  1618. }
  1619. return 0;
  1620. }
  1621. int LuaCreateAddinUnitMember(Lua_State * L)
  1622. {
  1623. if (Lua_GetTopIndex(L) != 3)
  1624. return 0;
  1625. char * strName = (char *)Lua_ValueToString(L, 1);
  1626. char * strMember = (char *)Lua_ValueToString(L, 2);
  1627. char * strGroup = (char *)Lua_ValueToString(L, 3);
  1628. int nUint = KUiChatCentre::FindAddinUnitIndex(strName);
  1629. if (nUint >= 0)
  1630. {
  1631. KUiChatCentre::AddFriendInfo(nUint, strMember, strGroup);
  1632. }
  1633. return 0;
  1634. }
  1635. int LuaDeleteAddinUnitMember(Lua_State * L)
  1636. {
  1637. if (Lua_GetTopIndex(L) != 2)
  1638. return 0;
  1639. char * strName = (char *)Lua_ValueToString(L, 1);
  1640. char * strMember = (char *)Lua_ValueToString(L, 2);
  1641. int nUint = KUiChatCentre::FindAddinUnitIndex(strName);
  1642. if (nUint >= 0)
  1643. {
  1644. KUiChatCentre::DeleteFriend(nUint, strMember, true);
  1645. }
  1646. return 0;
  1647. }
  1648. int LuaSetAddinUnitMemberStatus(Lua_State * L)
  1649. {
  1650. if (Lua_GetTopIndex(L) != 3)
  1651. return 0;
  1652. char * strName = (char *)Lua_ValueToString(L, 1);
  1653. char * strMember = (char *)Lua_ValueToString(L, 2);
  1654. char * strStatus = (char *)Lua_ValueToString(L, 3);
  1655. int nUint = KUiChatCentre::FindAddinUnitIndex(strName);
  1656. if (nUint >= 0)
  1657. {
  1658. int nStatus = stateOnline;
  1659. if (strStatus == NULL || strStatus[0] == 0)
  1660. nStatus = stateOffline;
  1661. KUiChatCentre::FriendStatus(nUint, strMember, nStatus);
  1662. }
  1663. return 0;
  1664. }
  1665. int LuaShowSomeoneMessage(Lua_State * L)
  1666. {
  1667. if (Lua_GetTopIndex(L) != 2)
  1668. return 0;
  1669. char * strName = (char *)Lua_ValueToString(L, 1);
  1670. char * strMessage = (char *)Lua_ValueToString(L, 2);
  1671. if (strName == NULL || strName[0] == 0)
  1672. return 0;
  1673. int nLen = strlen(strMessage);
  1674. char Buffer[1536];
  1675. nLen = KUiFaceSelector::ConvertFaceText(Buffer, strMessage, nLen);
  1676. nLen = TEncodeText(Buffer, nLen);
  1677. KUiMsgCentrePad::ShowSomeoneMessage(strName, Buffer, nLen);
  1678. return 0;
  1679. }
  1680. TLua_Funcs GameScriptFuns[] = 
  1681. {
  1682. {"Mouse_Action", Mouse_Action},
  1683. {"Mouse_Force0", Mouse_Force0},
  1684. {"Mouse_Force1", Mouse_Force1},
  1685. {"Mouse_MoveTo", Mouse_MoveTo}, //mode
  1686. {"Mouse_Menu", Mouse_Menu},
  1687. {"Mouse_Emote_Menu", Mouse_Emote_Menu},
  1688. {"Mouse_Say", Mouse_Say},
  1689. {"Mouse_MakeFriend", Mouse_MakeFriend},
  1690. {"Mouse_JoinTeam", Mouse_JoinTeam},
  1691. {"Mouse_InviteTeam", Mouse_InviteTeam},
  1692. {"Mouse_Trade", Mouse_Trade},
  1693. {"Mouse_Revenge", Mouse_Revenge},
  1694. {"Mouse_Follow", Mouse_Follow},
  1695. {"Mouse_ViewItem", Mouse_ViewItem},
  1696. {"Mouse_BlackList", Mouse_BlackList},
  1697. {"AddCommand", LuaAddCommand}, //char* szKey, char* szName, char* szScript
  1698. {"RemoveCommand", LuaRemoveCommand}, //char* szKey, char* szName
  1699. {"Open", LuaOpenWindow}, //char* szWindow
  1700. {"Focus", LuaFocusWindow}, //char* szWindow
  1701. {"Switch", LuaSwitchStatus}, //char* szStatus
  1702. {"ShortcutSkill", LuaShortcutSkill}, //int nIdex [0, SKILLTREE_SHORTCUT_SKILL_COUNT)
  1703. {"DirectShortcutSkill", LuaDirectShortcutSkill}, //int nIdex [0, SKILLTREE_SHORTCUT_SKILL_COUNT)
  1704. {"ShortcutUseItem", LuaShortcutUseItem}, //int nIdex [0, UPB_IMMEDIA_ITEM_COUNT)
  1705. {"MakeFriend", LuaMakeFriend}, //char* szPlayerName
  1706. {"CreateTeam", LuaCreateTeam},
  1707. {"JoinTeam", LuaJoinTeam}, //char* szTeamLeaderName
  1708. {"InviteTeam", LuaInviteTeam}, //char* szPlayerName
  1709. {"Trade", LuaTrade}, //char* szPlayerName
  1710. {"Revenge", LuaRevenge}, //char* szPlayerName
  1711. {"Follow", LuaFollow}, //char* szPlayerName
  1712. {"ViewItem", LuaViewItem}, //char* szPlayerName
  1713. {"PrintScreen", LuaPrintScreen},
  1714. {"ClearMessage", LuaClearMessage},
  1715. {"Say", LuaSay}, // char * strPlayerName, char * strMessage
  1716. {"Chat", LuaChat}, // char * strChannelName, char * strMessage
  1717. {"RegisterFunctionAlias", LuaRegisterFunctionAlias}, //char * strFunAlias, char * strFun, [int nParam], [Paramlist...]
  1718. {"SayPhrase", LuaSayPhrase}, //int nIndex
  1719. {"SetPhrase", LuaSetPhrase}, //int nIndex, char * strPhrase
  1720. {"SayEmote", LuaSayEmote},      //char* pszDestName, char* pszDestChannel, int nEmoteIndex
  1721. {"ExitGame", LuaExitGame},
  1722. {"Exit", LuaExit},
  1723. {"Set3D", LuaSet3D}, //int nBool
  1724. {"SetFullWindow", LuaSetFullWindow}, //int nBool
  1725. {"MoveWindow", LuaMoveWindow}, //char* szWindow, x, y
  1726. {"SizeWindow", LuaSizeWindow}, //char* szWindow, w, h
  1727. {"ShowWindow", LuaShowWindow}, //char* szWindow, bool
  1728. {"MoveTo", LuaMoveTo}, //dir, mode
  1729. {"TurnTo", LuaTurnTo}, //dir
  1730. {"ThrowAwayItem", LuaThrowAwayItem},
  1731. {"SetChatFontSize", LuaSetChatFontSzie}, //nFontSize
  1732. {"SetChannelTextColor", LuaSetChannelTextColor}, //char* strname, char* strColor, char* strBorderColor
  1733. {"SetMeTextColor", LuaSetMeTextColor}, //char* strColor, char* strBorderColor
  1734. {"SetFriendTextColor", LuaSetFriendTextColor}, //char* strColor, char* strBorderColor
  1735. {"SetStrangerTextColor", LuaSetStrangerTextColor}, //char* strColor, char* strBorderColor
  1736. {"AddBlackList", LuaAddBlackList}, //char* strName, [char* strGroup]
  1737. {"RemoveBlackList", LuaRemoveBlackList}, //char* strName
  1738. {"Debug", LuaDebug}, //char* strMode
  1739. {"SwitchChannel", LuaSwitchChannel},
  1740. {"RegisterEvent", LuaRegisterEvent}, //char* strName, HWND hWnd
  1741. {"UnregisterEvent", LuaUnregisterEvent}, //char* strName, HWND hWnd
  1742. {"SendEvent", LuaSendEvent}, //char* strName, char* szEvent
  1743. {"GetAppStatus", LuaGetAppStatus},
  1744. {"ShowSomeoneMessage", LuaShowSomeoneMessage}, //char* strName, char* szMessage
  1745. {"GetCurrentChannelName", LuaGetCurrentChannelName},//return the Current Channel Name if isn't private channel, or null in private channel
  1746. {"GetRecentPlayerName", LuaGetRecentPlayerName},    //return the telling player name if is private channel, or null in public channel
  1747. {"CreateAddinUnit", LuaCreateAddinUnit}, //char* strName
  1748. {"DeleteAddinUnit", LuaDeleteAddinUnit}, //char* strName
  1749. {"CreateUnitGroup", LuaCreateUnitGroup}, //char* strName, char* strGroup
  1750. {"RenameUnitGroup", LuaRenameUnitGroup}, //char* strName, char* strGroup, char* strNewGroup
  1751. {"MoveUnitGroup", LuaMoveUnitGroup}, //char* strName, char* strGroup, char* strNewGroup
  1752. {"DeleteUnitGroup", LuaDeleteUnitGroup}, //char* strName, char* strGroup
  1753. {"MoveUnitMember", LuaMoveUnitMember}, //char* strName, char* strMember, char* strGroup
  1754. {"CreateAddinUnitMember", LuaCreateAddinUnitMember}, //char* strName, char* strMember, char* strGroup
  1755. {"DeleteAddinUnitMember", LuaDeleteAddinUnitMember}, //char* strName, char* strMember
  1756. {"SetAddinUnitMemberStatus", LuaSetAddinUnitMemberStatus}, //char* strName, char* strMember, char* strStatus
  1757. {"ConvertEmotes", LuaConvertEmotes},        //Convert the WHOLE Emote File into Lua file
  1758. {"SetEmote", LuaSetEmote},                  //Set a emote expression, give 5 param,1 = command,2 = emote name,3 = emote expression with target,4 = emote expression without target,5 = emote index,if 5 set give,willl change the command,name,strings of emote with this index,if not give,this function will search the emote index by the command
  1759. {"SetScreenShotFolder", LuaSetScreenShotFolder},//Set the ScreenShot save folder
  1760. };
  1761. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1762. int g_GetGameScriptFunNum()
  1763. {
  1764. return sizeof(GameScriptFuns)  / sizeof(TLua_Funcs);
  1765. }
  1766. BOOL KShortcutKeyCentre::InitScript()
  1767. {
  1768. if (ms_Script.Init() && ms_Script.RegisterFunctions(GameScriptFuns, g_GetGameScriptFunNum()))
  1769. {
  1770. return LoadScript(UI_AUTOEXEC_SETTING_FILE);
  1771. }
  1772. return FALSE;
  1773. }
  1774. BOOL KShortcutKeyCentre::LoadScript(char* pFileName)
  1775. {
  1776. ClearScript();
  1777. return ms_Script.Load(pFileName);
  1778. }
  1779. BOOL KShortcutKeyCentre::UninitScript()
  1780. {
  1781. return ClearScript();
  1782. }
  1783. BOOL KShortcutKeyCentre::ClearScript()
  1784. {
  1785. if (ms_pCommands)
  1786. free(ms_pCommands);
  1787. ms_pCommands = NULL;
  1788. ms_nCommands = 0;
  1789. ms_FunsMap.clear();
  1790. g_UiChatPhrase.ClearAllPhrase();
  1791. return TRUE;
  1792. }
  1793. #define SCRIPT_SECTION "ScriptAuto"
  1794. BOOL KShortcutKeyCentre::LoadPrivateSetting(KIniFile* pFile)
  1795. {
  1796. if (pFile == NULL)
  1797. return FALSE;
  1798. int nVersion = 0;
  1799. pFile->GetInteger(SCRIPT_SECTION, "Version", 0, &nVersion);
  1800. int nVersionDefault = 1;
  1801. KIniFile* pFileDefault = g_UiBase.GetCommConfigFile();
  1802. if (pFileDefault)
  1803. pFileDefault->GetInteger("ShortcutSet", "Version", 1, &nVersionDefault);
  1804. if (nVersion < nVersionDefault) //没有系统缺省版本高的私人版本不加载
  1805. return FALSE;
  1806. ClearScript();
  1807. char szKey[10];
  1808. char szLine[256];
  1809. int i = 0;
  1810. while (1)
  1811. {
  1812. sprintf(szKey, "%d", i);
  1813. pFile->GetString(SCRIPT_SECTION, szKey, "", szLine, 255);
  1814. if (szLine[0] == 0)
  1815. break;
  1816. else
  1817. {
  1818. if (ms_Script.LoadBuffer((PBYTE)szLine, strlen(szLine)))
  1819. {
  1820. ms_Script.ExecuteCode();
  1821. }
  1822. }
  1823. i++;
  1824. }
  1825. return TRUE;
  1826. }
  1827. int SaveBlackListPrivateSetting(KIniFile* pFile, LPCSTR lpSection, int nStart);
  1828. BOOL KShortcutKeyCentre::SavePrivateSetting(KIniFile* pFile)
  1829. {
  1830. if (pFile == NULL)
  1831. return FALSE;
  1832. int nVersionDefault = 1;
  1833. KIniFile* pFileDefault = g_UiBase.GetCommConfigFile();
  1834. if (pFileDefault)
  1835. pFileDefault->GetInteger("ShortcutSet", "Version", 1, &nVersionDefault);
  1836. pFile->WriteInteger(SCRIPT_SECTION, "Version", nVersionDefault);
  1837. char szKey[10];
  1838. char szLine[512];
  1839. int i = 0;
  1840. for (; i < ms_nCommands; i++)
  1841. {
  1842. sprintf(szKey, "%d", i);
  1843. sprintf(szLine, "AddCommand("%s", "%s", "%s")", GetKeyName(ms_pCommands[i].uKey), ms_pCommands[i].szCommand, ms_pCommands[i].szDo);
  1844. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1845. }
  1846. SHORTFUNCMAP::iterator iFun = ms_FunsMap.begin();
  1847. while  (iFun != ms_FunsMap.end())
  1848. {
  1849. sprintf(szKey, "%d", i);
  1850. int nLen = sprintf(szLine, "RegisterFunctionAlias("%s", "%s", %d", iFun->first.c_str(), iFun->second.strName.c_str(),
  1851. iFun->second.nParamNum);
  1852. PARAMLIST::iterator iP = iFun->second.strDefaultParam.begin();
  1853. while (iP != iFun->second.strDefaultParam.end())
  1854. {
  1855. std::string strP = (*iP);
  1856. if (strP.empty() || strP == """")
  1857. nLen += sprintf(szLine + nLen, ", """);
  1858. else
  1859. nLen += sprintf(szLine + nLen, ", "%s"", strP.c_str());
  1860. iP++;
  1861. }
  1862. strcat(szLine + nLen, ")");
  1863. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1864. iFun++;
  1865. i++;
  1866. }
  1867. i = g_UiChatPhrase.SavePrivateSetting(pFile, SCRIPT_SECTION, i);
  1868. KWndWindow* pWin = NULL;
  1869. int nX, nY;
  1870. int nW, nH;
  1871. pWin = KUiMiniMap::GetSelf();
  1872. if (pWin)
  1873. {
  1874. sprintf(szKey, "%d", i);
  1875. pWin->GetPosition(&nX, &nY);
  1876. sprintf(szLine, "MoveWindow("%s", %d, %d)", "map", nX, nY);
  1877. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1878. i++;
  1879. sprintf(szKey, "%d", i);
  1880. sprintf(szLine, "ShowWindow("%s", %d)", "map", pWin->IsVisible() ? 1 : 0);
  1881. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1882. i++;
  1883. }
  1884. pWin = KUiHeaderControlBar::GetSelf();
  1885. if (pWin)
  1886. {
  1887. sprintf(szKey, "%d", i);
  1888. pWin->GetPosition(&nX, &nY);
  1889. sprintf(szLine, "MoveWindow("%s", %d, %d)", "statustool", nX, nY);
  1890. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1891. i++;
  1892. sprintf(szKey, "%d", i);
  1893. sprintf(szLine, "ShowWindow("%s", %d)", "statustool", pWin->IsVisible() ? 1 : 0);
  1894. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1895. i++;
  1896. }
  1897. pWin = KUiToolsControlBar::GetSelf();
  1898. if (pWin)
  1899. {
  1900. sprintf(szKey, "%d", i);
  1901. pWin->GetPosition(&nX, &nY);
  1902. sprintf(szLine, "MoveWindow("%s", %d, %d)", "normaltool", nX, nY);
  1903. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1904. i++;
  1905. sprintf(szKey, "%d", i);
  1906. sprintf(szLine, "ShowWindow("%s", %d)", "normaltool", pWin->IsVisible() ? 1 : 0);
  1907. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1908. i++;
  1909. }
  1910. pWin = KUiMsgCentrePad::GetSelf();
  1911. if (pWin)
  1912. {
  1913. sprintf(szKey, "%d", i);
  1914. pWin->GetPosition(&nX, &nY);
  1915. sprintf(szLine, "MoveWindow("%s", %d, %d)", "chatroom", nX, nY);
  1916. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1917. i++;
  1918. sprintf(szKey, "%d", i);
  1919. pWin->GetSize(&nW, &nH);
  1920. sprintf(szLine, "SizeWindow("%s", %d, %d)", "chatroom", nW, nH);
  1921. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1922. i++;
  1923. sprintf(szKey, "%d", i);
  1924. sprintf(szLine, "ShowWindow("%s", %d)", "chatroom", pWin->IsVisible() ? 1 : 0);
  1925. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1926. i++;
  1927. sprintf(szKey, "%d", i);
  1928. sprintf(szLine, "SetChatFontSize(%d)", KUiMsgCentrePad::GetFontSize());
  1929. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1930. i++;
  1931. int nCIndex = 0;
  1932. DWORD uColor = 0;
  1933. DWORD uBColor = 0;
  1934. char* pTitle = NULL;
  1935. while (1)
  1936. {
  1937. uColor = 0;
  1938. uBColor = 0;
  1939. pTitle = KUiMsgCentrePad::GetChannelTextColor(nCIndex++, uColor, uBColor);
  1940. if (pTitle == NULL)
  1941. break;
  1942. sprintf(szKey, "%d", i);
  1943. sprintf(szLine, "SetChannelTextColor("%s", "%s", "%s")", pTitle, std::string(GetColorString(uColor)).c_str(), std::string(GetColorString(uBColor)).c_str());
  1944. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1945. i++;
  1946. }
  1947. uColor = 0;
  1948. uBColor = 0;
  1949. KUiMsgCentrePad::GetMSNTextColor(0, uColor, uBColor);
  1950. sprintf(szKey, "%d", i);
  1951. sprintf(szLine, "SetMeTextColor("%s", "%s")", std::string(GetColorString(uColor)).c_str(), std::string(GetColorString(uBColor)).c_str());
  1952. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1953. i++;
  1954. uColor = 0;
  1955. uBColor = 0;
  1956. KUiMsgCentrePad::GetMSNTextColor(1, uColor, uBColor);
  1957. sprintf(szKey, "%d", i);
  1958. sprintf(szLine, "SetFriendTextColor("%s", "%s")", std::string(GetColorString(uColor)).c_str(), std::string(GetColorString(uBColor)).c_str());
  1959. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1960. i++;
  1961. uColor = 0;
  1962. uBColor = 0;
  1963. KUiMsgCentrePad::GetMSNTextColor(2, uColor, uBColor);
  1964. sprintf(szKey, "%d", i);
  1965. sprintf(szLine, "SetStrangerTextColor("%s", "%s")", std::string(GetColorString(uColor)).c_str(), std::string(GetColorString(uBColor)).c_str());
  1966. pFile->WriteString(SCRIPT_SECTION, szKey, szLine);
  1967. i++;
  1968. }
  1969. i = SaveBlackListPrivateSetting(pFile, SCRIPT_SECTION, i);
  1970. return i;
  1971. }
  1972. size_t Compile(const char* src, char* dst, size_t dstlen) 
  1973.         static const char str_param_begin[] = " ( "; 
  1974.         static const char str_param_end[] = " ) "; 
  1975.         static const char str_param_split[] = ", "; 
  1976.   static const char str_quote_begin[] = """;
  1977. static const char str_quote_end[] = """;
  1978. static const size_t len_param_begin = sizeof(str_param_begin) - sizeof(str_param_begin[0]); 
  1979.         static const size_t len_param_end = sizeof(str_param_end) - sizeof(str_param_end[0]); 
  1980.         static const size_t len_param_split = sizeof(str_param_split) - sizeof(str_param_split[0]); 
  1981. static const char len_quote_begin = sizeof(str_quote_begin) - sizeof(str_quote_begin[0]);
  1982. static const char len_quote_end = sizeof(str_quote_end) - sizeof(str_quote_end[0]);
  1983.         if (src == NULL || dst == NULL || dstlen <= 0) 
  1984.                 return 0; 
  1985. SHORTFUNCMAP::iterator iFun = KShortcutKeyCentre::ms_FunsMap.end();
  1986.         size_t uselen = 0; 
  1987.         size_t cntToken = 0; 
  1988.         const char* szToken = NULL; 
  1989.         const char* szNext = src - 1; 
  1990.         for ( ; ; ) 
  1991.         { 
  1992.                 for (szToken = szNext + 1; *szToken; szToken++) 
  1993.                 { 
  1994.                         if (__x_isgraph(*szToken)) 
  1995.                                 break; 
  1996.                 } 
  1997.                 if (!*szToken) 
  1998.                         break; 
  1999.                 for (szNext = szToken + 1; *szNext; szNext++) 
  2000.                 { 
  2001.                         if (!__x_isgraph(*szNext)) 
  2002.                                 break; 
  2003.                 } 
  2004.                 size_t toklen = szNext - szToken; 
  2005.                 if (cntToken > 0) 
  2006.                 {//param 
  2007.                         if (cntToken > 1) 
  2008.                         {//non first param 
  2009.                                 if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_param_split, len_param_split)) 
  2010. return 0; 
  2011.                                 uselen += len_param_split; 
  2012.                         } 
  2013. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_quote_begin, len_quote_begin))
  2014. return 0;
  2015. uselen += len_quote_begin;
  2016. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, szToken, toklen))
  2017. return 0;
  2018. uselen += toklen;
  2019. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_quote_end, len_quote_end))
  2020. return 0;
  2021. uselen += len_quote_end;
  2022.                 } 
  2023.                 else 
  2024.                 {//func name 
  2025. iFun = KShortcutKeyCentre::ms_FunsMap.find(std::string(szToken, toklen));
  2026. if (iFun == KShortcutKeyCentre::ms_FunsMap.end())
  2027. {
  2028. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, szToken, toklen)) 
  2029. return 0; 
  2030. uselen += toklen; 
  2031. }
  2032. else
  2033. {
  2034. const std::string& name = iFun->second.strName;
  2035. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, name.c_str(), name.size())) 
  2036. return 0; 
  2037. uselen += name.size(); 
  2038. }
  2039.                         
  2040.                         if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_param_begin, len_param_begin)) 
  2041.                                 return 0; 
  2042.                         uselen += len_param_begin; 
  2043.                 } 
  2044.                 cntToken ++; 
  2045. if (!*szNext)
  2046. break;
  2047.         } 
  2048.         if (cntToken > 0) 
  2049.         {//is func, fill ')' 
  2050. if (iFun != KShortcutKeyCentre::ms_FunsMap.end())
  2051. {
  2052. int nParamCount = cntToken - 1;
  2053. if (iFun->second.nParamNum - nParamCount > 0)
  2054. { //补默认参数
  2055. _ASSERT(iFun->second.strDefaultParam.size() == iFun->second.nParamNum);
  2056. PARAMLIST::iterator iP = iFun->second.strDefaultParam.begin();
  2057. for (int nSkip = nParamCount; nSkip > 0; nSkip--)
  2058. {
  2059. iP++;
  2060. }
  2061. for (int nDefault = iFun->second.nParamNum - nParamCount; nDefault > 0; nDefault--)
  2062. {
  2063. if (nParamCount > 0)
  2064. {
  2065. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_param_split, len_param_split)) 
  2066. return 0;
  2067. uselen += len_param_split;
  2068. }
  2069. const std::string& name = (*iP);
  2070. iP++;
  2071. if (!__x_memcpy_n(dst + uselen, dstlen - uselen, name.c_str(), name.size())) 
  2072. return 0; 
  2073. uselen += name.size();
  2074. nParamCount++;
  2075. }
  2076. }
  2077. }
  2078.             if (!__x_memcpy_n(dst + uselen, dstlen - uselen, str_param_end, len_param_end)) 
  2079. return 0;
  2080.             uselen += len_param_end; 
  2081.         }
  2082.         return uselen; 
  2083. BOOL KShortcutKeyCentre::TranslateExcuteScript(const char * ScriptCommand)
  2084. {
  2085. if (ScriptCommand && ScriptCommand[0] != 0)
  2086. {
  2087. int nIndex = FindCommand(ScriptCommand); //首先寻找快捷键带的名称
  2088. if (nIndex >= 0)
  2089. {
  2090. if (ms_pCommands[nIndex].szDo[0] != 0)
  2091. return ExcuteScript(ms_pCommands[nIndex].szDo);
  2092. }
  2093. else//翻译通常语法为严格语法
  2094. {
  2095. char szTrueCommand[512];
  2096. szTrueCommand[0] = 0;
  2097. //语法转换和函数名转换
  2098. int nLen = Compile(ScriptCommand, szTrueCommand, 511);
  2099. szTrueCommand[nLen] = 0;
  2100. return ExcuteScript(szTrueCommand);
  2101. }
  2102. }
  2103. return FALSE;
  2104. }
  2105. BOOL KShortcutKeyCentre::ExcuteScript(const char * ScriptCommand)
  2106. {
  2107. if (g_UiBase.GetStatus() != UIS_S_IDLE || !ms_Enable)
  2108. return FALSE;
  2109. if (ScriptCommand && ScriptCommand[0] != 0)
  2110. {
  2111. if (ms_Script.LoadBuffer((PBYTE)ScriptCommand, strlen(ScriptCommand)))
  2112. {
  2113. return ms_Script.ExecuteCode();
  2114. }
  2115. }
  2116. return FALSE;
  2117. }
  2118. BOOL KShortcutKeyCentre::ExcuteHWNDScript(const char * ScriptCommand)
  2119. {
  2120. if (ScriptCommand && ScriptCommand[0] != 0)
  2121. {
  2122. if (ms_Script.LoadBuffer((PBYTE)ScriptCommand, strlen(ScriptCommand)))
  2123. {
  2124. return ms_Script.ExecuteCode();
  2125. }
  2126. }
  2127. return FALSE;
  2128. }
  2129. int KShortcutKeyCentre::AddCommand(COMMAND_SETTING* pAdd) //复制Add数据并增加到Commands中,如果uKey!=0则覆盖原uKey,否则如szCommand[0]!=0则覆盖szCommand相同者
  2130. {
  2131. int nIndex = -1;
  2132. if (pAdd == NULL)
  2133. return nIndex;
  2134. if (pAdd->uKey != 0)
  2135. {
  2136. nIndex = FindCommand(pAdd->uKey);
  2137. }
  2138. else if (pAdd->szCommand[0] != 0)
  2139. {
  2140. nIndex = FindCommand(pAdd->szCommand);
  2141. }
  2142. else
  2143. return nIndex;
  2144. if (nIndex >= 0)
  2145. {
  2146. ms_pCommands[nIndex] = *pAdd;
  2147. }
  2148. else
  2149. {
  2150. if (ms_pCommands == NULL)
  2151. {
  2152. ms_pCommands = (COMMAND_SETTING*)malloc(sizeof(COMMAND_SETTING));
  2153. ms_pCommands[0] = *pAdd;
  2154. nIndex = 0;
  2155. ms_nCommands = 1;
  2156. }
  2157. else
  2158. {
  2159. ms_pCommands = (COMMAND_SETTING*)realloc(ms_pCommands, sizeof(COMMAND_SETTING) * (ms_nCommands + 1));
  2160. ms_pCommands[ms_nCommands] = *pAdd;
  2161. nIndex = ms_nCommands;
  2162. ms_nCommands++;
  2163. }
  2164. }
  2165. return nIndex;
  2166. }
  2167. int KShortcutKeyCentre::RemoveCommand(int nIndex) //返回剩余Command的总数
  2168. {
  2169. if (ms_pCommands && nIndex >= 0 && nIndex < ms_nCommands)
  2170. {
  2171. if (nIndex != ms_nCommands - 1)
  2172. {
  2173. memmove(ms_pCommands + nIndex, ms_pCommands + nIndex + 1, sizeof(COMMAND_SETTING));
  2174. }
  2175. ms_nCommands--;
  2176. }
  2177. return ms_nCommands;
  2178. }
  2179. void KShortcutKeyCentre::RemoveCommandAll()
  2180. {
  2181. ms_nCommands = 0;
  2182. }
  2183. int KShortcutKeyCentre::FindCommand(DWORD uKey)
  2184. {
  2185. if (uKey == 0)
  2186. return -1;
  2187. for (int i = 0; i < ms_nCommands; i++)
  2188. {
  2189. if (ms_pCommands[i].uKey != 0 && ms_pCommands[i].uKey == uKey)
  2190. return i;
  2191. }
  2192. return -1;
  2193. }
  2194. int KShortcutKeyCentre::FindCommand(const char* szCommand)
  2195. {
  2196. if (szCommand == NULL || szCommand[0] == 0)
  2197. return -1;
  2198. for (int i = 0; i < ms_nCommands; i++)
  2199. {
  2200. if (ms_pCommands[i].szCommand[0] != 0 &&
  2201. strcmpi(ms_pCommands[i].szCommand, szCommand) == 0)
  2202. return i;
  2203. }
  2204. return -1;
  2205. }
  2206. int KShortcutKeyCentre::FindCommandByScript(const char* szScript)
  2207. {
  2208. if (szScript == NULL || szScript[0] == 0)
  2209. return -1;
  2210. for (int i = 0; i < ms_nCommands; i++)
  2211. {
  2212. if (ms_pCommands[i].szDo[0] != 0 &&
  2213. strcmpi(ms_pCommands[i].szDo, szScript) == 0)
  2214. return i;
  2215. }
  2216. return -1;
  2217. }
  2218. DWORD KShortcutKeyCentre::GetCommandKey(int nIndex)
  2219. {
  2220. if (nIndex >= 0 && nIndex < ms_nCommands)
  2221. {
  2222. return ms_pCommands[nIndex].uKey;
  2223. }
  2224. return 0;
  2225. }
  2226. const char* KShortcutKeyCentre::GetKeyName(DWORD Key)
  2227. {
  2228. static std::string s_descHK;
  2229. s_descHK = hotkey_str::DescHotKey(Key);
  2230. return s_descHK.c_str();
  2231. }
  2232. BOOL KShortcutKeyCentre::RegisterFunctionAlias(const char * strFunAlias, const char * strFun, int nParam, const PARAMLIST& List)
  2233. {
  2234. if (strFunAlias && strFunAlias[0] != 0 &&
  2235. strFun && strFun[0] != 0)
  2236. {
  2237. ShortFuncInfo info;
  2238. info.strName = strFun;
  2239. info.nParamNum = nParam;
  2240. info.strDefaultParam = List;
  2241. if (info.nParamNum >= info.strDefaultParam.size())
  2242. {
  2243. for (int i = info.nParamNum - info.strDefaultParam.size(); i > 0; i--)
  2244. {
  2245. info.strDefaultParam.push_back("""");
  2246. }
  2247. }
  2248. else
  2249. {
  2250. for (int i = info.strDefaultParam.size() - info.nParamNum; i > 0; i--)
  2251. {
  2252. info.strDefaultParam.pop_back();
  2253. }
  2254. }
  2255. _ASSERT(info.nParamNum == info.strDefaultParam.size());
  2256. ms_FunsMap[strFunAlias] = info;
  2257. return TRUE;
  2258. }
  2259. return FALSE;
  2260. }