DlgOption.cpp
上传用户:tianheyiqi
上传日期:2010-04-16
资源大小:282k
文件大小:9k
源码类别:

外挂编程

开发平台:

Visual C++

  1. // DlgOption.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "roa.h"
  5. #include "DlgOption.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDlgOption dialog
  13. CDlgOption::CDlgOption(BOOL bInRoa, CWnd* pParent /*=NULL*/)
  14. : CDialog(CDlgOption::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDlgOption)
  17. //}}AFX_DATA_INIT
  18. m_bShowAdvanced = false;
  19. m_bInRoa = bInRoa;
  20. }
  21. void CDlgOption::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CDlgOption)
  25. //}}AFX_DATA_MAP
  26. DDX_Radio(pDX, IDC_RAD_SERVER_OFFICAL, m_option.bTestServer);
  27. GetDlgItem(IDC_EDT_LAUNCHER_PARAM)->EnableWindow(m_option.bTestServer);
  28. if(m_option.bTestServer)
  29. SetDlgItemText(IDC_STATIC_ROEXE, _T("客户端启动程序:  (请选择Sakexe.exe)"));
  30. else
  31. SetDlgItemText(IDC_STATIC_ROEXE, _T("客户端启动程序:  (请选择RoClient.exe或SakClient.exe)"));
  32. DDX_Check(pDX, IDC_CHK_USEPARTYCHAT, m_option.bUsePartyChat);
  33. DDX_Check(pDX, IDC_CHK_AUTOPICK, m_option.bAutoPickup);
  34. GetDlgItem(IDC_CHK_MOVEPICKUP)->EnableWindow(m_option.bAutoPickup);
  35. DDX_Check(pDX, IDC_CHK_BOSSINFO, m_option.bBossInfo);
  36. DDX_Check(pDX, IDC_CHK_MOVEPICKUP, m_option.bMovePickup);
  37. DDX_Text(pDX, IDC_EDT_LAUNCHER, m_option.strLauncher);
  38. DDX_Text(pDX, IDC_EDT_LAUNCHER_PARAM, m_option.strLaunchParam);
  39. DDX_Check(pDX, IDC_CHK_NPC_AUTOCONTINUE, m_option.bNpcTalkContinue);
  40. DDX_Text(pDX, IDC_EDT_WELCOMEDELAY, m_option.nWelcomeDelay);
  41. DDX_Text(pDX, IDC_EDT_AUTOSEARCHDELAY, m_option.nAutoSearchDelay);
  42. DDX_Text(pDX, IDC_EDT_ATTACKPERSECOND, m_option.nAttackPerSecond);
  43. DDX_Text(pDX, IDC_EDT_PICKUPDISTANCE, m_option.nPickupDistance);
  44. DDX_Text(pDX, IDC_EDT_HPITEMS, m_option.strHPRecoverItems);
  45. DDX_Text(pDX, IDC_EDT_SPITEMS, m_option.strSPRecoverItems);
  46. DDX_Text(pDX, IDC_EDT_ITEMUSEINTERVAL, m_option.nItemUseInterval);
  47. }
  48. BEGIN_MESSAGE_MAP(CDlgOption, CDialog)
  49. //{{AFX_MSG_MAP(CDlgOption)
  50. ON_BN_CLICKED(IDC_CHK_AUTOPICK, OnChkAutopick)
  51. ON_BN_CLICKED(IDC_BTN_BROWSE, OnBtnBrowse)
  52. ON_BN_CLICKED(IDC_BTN_ADVANCEOPTION, OnBtnAdvanceoption)
  53. ON_BN_CLICKED(IDC_RAD_SERVER_TEST, OnRadServerTest)
  54. ON_BN_CLICKED(IDC_RAD_SERVER_OFFICAL, OnRadServerOffical)
  55. ON_BN_CLICKED(IDC_BTN_CANCEL, OnBtnCancel)
  56. ON_BN_CLICKED(IDC_BTN_RESTORE, OnBtnRestore)
  57. ON_EN_CHANGE(IDC_EDT_README, OnChangeEdtReadme)
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CDlgOption message handlers
  62. BOOL CDlgOption::OnInitDialog() 
  63. {
  64. CDialog::OnInitDialog();
  65. // TODO: Add extra initialization here
  66. UpdateData(false);
  67. CString strTemp;
  68. strTemp = _T("Ragnarok Online Addin 3.40 by OUTMANrn");
  69. strTemp += _T("-----------------------------------------------rn");
  70. strTemp += _T("* 请勿用于官方服务器,如不同意请马上退出本程序rn");
  71. strTemp += _T("* 已全面支持Windows 98/ME/2000/XP/2003rn");
  72. strTemp += _T("* 更新信息请参照version.txtrn");
  73. strTemp += _T("-----------------------------------------------rn");
  74. strTemp += _T("* http://www.yxzone.comrn");
  75. GetDlgItem(IDC_EDT_README)->SetWindowText(strTemp);
  76. ShowAdvancedOption();
  77. GetDlgItem(IDC_BTN_RESTORE)->EnableWindow(!m_bInRoa);
  78. GetDlgItem(IDC_RAD_SERVER_OFFICAL)->EnableWindow(!m_bInRoa);
  79. GetDlgItem(IDC_RAD_SERVER_TEST)->EnableWindow(!m_bInRoa);
  80. GetDlgItem(IDC_STATIC_ROEXE)->EnableWindow(!m_bInRoa);
  81. GetDlgItem(IDC_EDT_LAUNCHER)->EnableWindow(!m_bInRoa);
  82. GetDlgItem(IDC_BTN_BROWSE)->EnableWindow(!m_bInRoa);
  83. GetDlgItem(IDC_EDT_LAUNCHER_PARAM)->EnableWindow(!m_bInRoa);
  84. GetDlgItem(IDC_STATIC_SFEXE)->EnableWindow(!m_bInRoa);
  85. GetDlgItem(IDC_BTN_CANCEL)->EnableWindow(!m_bInRoa);
  86. /* if(!m_bInRoa)
  87. {
  88. if(IDYES == MessageBox(_T("是否先恢复RO客户端?(从ROA3.31以下版本升级用户请先恢复RO客户端)"), _T("恢复客户端"), MB_YESNO | MB_ICONQUESTION))
  89. {
  90. OnBtnRestore();
  91. }
  92. }
  93. */
  94. return TRUE;  // return TRUE unless you set the focus to a control
  95.               // EXCEPTION: OCX Property Pages should return FALSE
  96. }
  97. void CDlgOption::OnOK() 
  98. {
  99. // TODO: Add extra validation here
  100. UpdateData(true);
  101. CDialog::OnOK();
  102. }
  103. void CDlgOption::OnChkAutopick() 
  104. {
  105. // TODO: Add your control notification handler code here
  106. UpdateData(true);
  107. }
  108. void CDlgOption::OnBtnBrowse() 
  109. {
  110. // TODO: Add your control notification handler code here
  111. static char BASED_CODE szFilter[] = "Executable Files (*.exe)|*.exe||";
  112. CFileDialog dlgFile(true, ".exe", "RoClient.exe", OFN_HIDEREADONLY, szFilter, this);
  113. char buffer[1024];
  114. GetCurrentDirectory(1024, buffer);
  115. if(IDOK == dlgFile.DoModal())
  116. {
  117. UpdateData(true);
  118. m_option.strLauncher = dlgFile.GetPathName();
  119. if(m_option.strLauncher.Right(4).CompareNoCase(_T(".exe")) != 0)
  120. {
  121. m_option.strLauncher += _T(".exe");
  122. }
  123. UpdateData(false);
  124. }
  125. SetCurrentDirectory(buffer);
  126. }
  127. void CDlgOption::ShowAdvancedOption()
  128. {
  129. WINDOWPLACEMENT wndpl;
  130. GetWindowPlacement(&wndpl);
  131. if(m_bShowAdvanced)
  132. {
  133. SetDlgItemText(IDC_BTN_ADVANCEOPTION, _T("高级选项<<<"));
  134. wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + 495;
  135. }
  136. else
  137. {
  138. SetDlgItemText(IDC_BTN_ADVANCEOPTION, _T("高级选项>>>"));
  139. wndpl.rcNormalPosition.bottom = wndpl.rcNormalPosition.top + 388;
  140. }
  141. SetWindowPlacement(&wndpl);
  142. }
  143. void CDlgOption::OnBtnAdvanceoption() 
  144. {
  145. // TODO: Add your control notification handler code here
  146. m_bShowAdvanced = !m_bShowAdvanced;
  147. ShowAdvancedOption();
  148. }
  149. void CDlgOption::OnRadServerTest() 
  150. {
  151. // TODO: Add your control notification handler code here
  152. UpdateData(true);
  153. }
  154. void CDlgOption::OnRadServerOffical() 
  155. {
  156. // TODO: Add your control notification handler code here
  157. UpdateData(true);
  158. }
  159. void CDlgOption::OnBtnCancel() 
  160. {
  161. // TODO: Add your control notification handler code here
  162. CDialog::OnCancel();
  163. }
  164. int CDlgOption::RestoreFile(LPCTSTR lpszPath, LPCTSTR lpszRestore)
  165. {
  166. CString strRoaExec, strRoExec, strOutput = _T("");
  167. int nRet = -1;
  168. strRoExec.Format(_T("%s%s"), lpszPath, lpszRestore);
  169. if(utlGetFileSize(strRoExec) < 100000)
  170. {
  171. strRoaExec.Format(_T("%sROA%s"), lpszPath, lpszRestore);
  172. if(utlGetFileSize(strRoaExec) > 100000)
  173. {
  174. ::CopyFile(strRoaExec, strRoExec, false);
  175. ::DeleteFile(strRoaExec);
  176. strRoaExec.Format(_T("%s%s.dat"), lpszPath, lpszRestore);
  177. ::DeleteFile(strRoaExec);
  178. nRet = 1;
  179. }
  180. else
  181. {
  182. strRoaExec.Format(_T("%s%s.dat"), lpszPath, lpszRestore);
  183. if(utlGetFileSize(strRoaExec) > 100000)
  184. {
  185. ::CopyFile(strRoaExec, strRoExec, false);
  186. ::DeleteFile(strRoaExec);
  187. nRet = 2;
  188. }
  189. }
  190. }
  191. else
  192. {
  193. nRet = 0;
  194. }
  195. switch(nRet)
  196. {
  197. case -1:
  198. strOutput.Format(_T("无法恢复%s"), strRoExec);
  199. break;
  200. case 0:
  201. break;
  202. case 1:
  203. strOutput.Format(_T("从ROA3.30以上版本恢复%s"), strRoExec);
  204. break;
  205. case 2:
  206. strOutput.Format(_T("从ROA3.31以下版本恢复%s"), strRoExec);
  207. break;
  208. default:
  209. ASSERT(false);
  210. break;
  211. }
  212. if(!strOutput.IsEmpty())
  213. {
  214. MessageBox(strOutput, _T("恢复RO客户端"), MB_OK | MB_ICONINFORMATION);
  215. }
  216. return(nRet);
  217. }
  218. void CDlgOption::OnBtnRestore() 
  219. {
  220. // TODO: Add your control notification handler code here
  221. int nRet = -1;
  222. CString strTemp, strRoFile, strRoPath, strError, strRoaFile, strRoaInject, strDInput, strDInputFake;
  223. CString strRoExec, strRoaExec;
  224. int nIndex;
  225. int nClientType = eUnknown;
  226. strTemp = m_option.strLauncher;
  227. do
  228. {
  229. // Get EXE Name
  230. nIndex = strTemp.ReverseFind(_T('\'));
  231. if(-1 == nIndex)
  232. {
  233. strError = "客户端启动程序定义错误,请检查并重新定义!";
  234. MessageBox(strError, _T("恢复RO客户端"), MB_OK | MB_ICONSTOP);
  235. break;
  236. }
  237. strRoFile = strTemp.Right(strTemp.GetLength() - nIndex -1);
  238. strRoPath = strTemp.Left(nIndex + 1);
  239. strRoaInject = strRoPath + _T("ROAInject.dll");
  240. ::DeleteFile(strRoaInject);
  241. strDInput = strRoPath + "dinput.dll";
  242. strDInputFake = strRoPath + "dinput.dl_";
  243. if(utlGetFileSize(strDInputFake) > 0)
  244. {
  245. ::CopyFile(strDInputFake, strDInput, false);
  246. ::DeleteFile(strDInputFake);
  247. }
  248. // Restore ragexe.exe
  249. if(RestoreFile(strRoPath, _T("ragexe.exe")) < 0)
  250. break;
  251. // Restore sakexe.exe
  252. if(RestoreFile(strRoPath, _T("sakexe.exe")) < 0)
  253. break;
  254. // // Restore sakexe.exe
  255. // if(RestoreFile(strRoPath, _T("Ragnarok.exe")) < 0)
  256. // break;
  257. nRet = 0;
  258. }while(0);
  259. if(0 == nRet)
  260. {
  261. MessageBox(_T("成功恢复RO客户端文件!"), _T("恢复RO客户端"), MB_OK | MB_ICONINFORMATION);
  262. }
  263. else
  264. {
  265. MessageBox(_T("恢复RO客户端文件失败,请重新安装RO客户端!"), _T("恢复RO客户端"), MB_OK | MB_ICONINFORMATION);
  266. }
  267. return;
  268. }
  269. void CDlgOption::OnChangeEdtReadme() 
  270. {
  271. // TODO: If this is a RICHEDIT control, the control will not
  272. // send this notification unless you override the CDialog::OnInitDialog()
  273. // function and call CRichEditCtrl().SetEventMask()
  274. // with the ENM_CHANGE flag ORed into the mask.
  275. // TODO: Add your control notification handler code here
  276. }