提示:所有的研究心得直接写在源码注释中,对照源码看注释即可学习了解传奇的流程架构。《Delphi传奇》全部源码获取可加入Delphi开发局QQ群:32422310

《Delphi传奇》服务端控制中心(服务器网关启动器)源码文件夹如下:

主窗体源码和注释:

unit GMain;
{
1、procedure TfrmMain.SendGameList(Socket: TCustomWinSocket);向客户端发送SM_SENDGAMELIST
(实际上是发送给客户端登的登陆器,由登陆器启动客户端,那么登陆器必须先连接本程序)
包含 LoginGate 游戏登录网关服务器的地址.以便于客户端连接
加载 StartServer_LGIP.txt文件读取 LoginGate的地址
}
interface
{$WARN UNIT_PLATFORM OFF}
usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, ComCtrls, StdCtrls,INIFiles, ExtCtrls,Spin, JSocket,WinInet,ComObj,shellapi,IdBaseComponent, IdComponent, IdTCPConnection,IdTCPClient, IdHTTP,DateUtils;typeTfrmMain = class(TForm)PageControl1: TPageControl;TabSheet1: TTabSheet;TabSheet2: TTabSheet;TabSheet3: TTabSheet;PageControl2: TPageControl;PageControl3: TPageControl;TabSheet4: TTabSheet;TabSheet5: TTabSheet;TabSheet6: TTabSheet;GroupBox1: TGroupBox;Label1: TLabel;EditGameDir: TEdit;Button1: TButton;Label2: TLabel;EditHeroDB: TEdit;ButtonNext1: TButton;ButtonNext2: TButton;GroupBox2: TGroupBox;ButtonPrv2: TButton;GroupBox4: TGroupBox;Label7: TLabel;Label6: TLabel;Label5: TLabel;EditM2ServerRegKey: TEdit;EditRunGateRegKey: TEdit;EditDBServerRegKey: TEdit;EditGameName: TEdit;Label3: TLabel;Label4: TLabel;EditGameExtIPaddr: TEdit;GroupBox5: TGroupBox;EditM2ServerProgram: TEdit;EditDBServerProgram: TEdit;EditLoginSrvProgram: TEdit;EditLogServerProgram: TEdit;EditLoginGateProgram: TEdit;EditSelGateProgram: TEdit;EditRunGateProgram: TEdit;ButtonStartGame: TButton;CheckBoxM2Server: TCheckBox;CheckBoxDBServer: TCheckBox;CheckBoxLoginServer: TCheckBox;CheckBoxLogServer: TCheckBox;CheckBoxLoginGate: TCheckBox;CheckBoxSelGate: TCheckBox;CheckBoxRunGate: TCheckBox;CheckBoxRunGate1: TCheckBox;EditRunGate1Program: TEdit;CheckBoxRunGate2: TCheckBox;EditRunGate2Program: TEdit;TimerStartGame: TTimer;TimerStopGame: TTimer;TimerCheckRun: TTimer;MemoLog: TMemo;GroupBox6: TGroupBox;Label8: TLabel;EditSkin: TSpinEdit;ButtonFormSave: TButton;ButtonReLoadConfig: TButton;GroupBox7: TGroupBox;Label9: TLabel;EditLoginGate_MainFormX: TSpinEdit;Label10: TLabel;EditLoginGate_MainFormY: TSpinEdit;GroupBox3: TGroupBox;GroupBox8: TGroupBox;Label11: TLabel;Label12: TLabel;EditSelGate_MainFormX: TSpinEdit;EditSelGate_MainFormY: TSpinEdit;TabSheet7: TTabSheet;GroupBox9: TGroupBox;GroupBox10: TGroupBox;Label13: TLabel;Label14: TLabel;EditLoginServer_MainFormX: TSpinEdit;EditLoginServer_MainFormY: TSpinEdit;TabSheet8: TTabSheet;GroupBox11: TGroupBox;GroupBox12: TGroupBox;Label15: TLabel;Label16: TLabel;EditDBServer_MainFormX: TSpinEdit;EditDBServer_MainFormY: TSpinEdit;TabSheet9: TTabSheet;GroupBox13: TGroupBox;GroupBox14: TGroupBox;Label17: TLabel;Label18: TLabel;EditLogServer_MainFormX: TSpinEdit;EditLogServer_MainFormY: TSpinEdit;TabSheet10: TTabSheet;GroupBox15: TGroupBox;GroupBox16: TGroupBox;Label19: TLabel;Label20: TLabel;EditM2Server_MainFormX: TSpinEdit;EditM2Server_MainFormY: TSpinEdit;TabSheet11: TTabSheet;ButtonSave: TButton;ButtonGenGameConfig: TButton;ButtonPrv3: TButton;ButtonNext3: TButton;TabSheet12: TTabSheet;ButtonPrv4: TButton;ButtonNext4: TButton;ButtonPrv5: TButton;ButtonNext5: TButton;ButtonPrv6: TButton;ButtonNext6: TButton;ButtonPrv7: TButton;ButtonNext7: TButton;ButtonPrv8: TButton;ButtonNext8: TButton;ButtonPrv9: TButton;GroupBox17: TGroupBox;GroupBox18: TGroupBox;Label21: TLabel;Label22: TLabel;EditRunGate_MainFormX: TSpinEdit;EditRunGate_MainFormY: TSpinEdit;GroupBox19: TGroupBox;Label23: TLabel;EditRunGate_Connt: TSpinEdit;TabSheet13: TTabSheet;ButtonLoginServerConfig: TButton;ButtonAdv: TButton;CheckBoxDynamicIPMode: TCheckBox;GroupBox20: TGroupBox;CheckBoxDisableAutoGame: TCheckBox;TabSheet14: TTabSheet;GroupBox21: TGroupBox;Label24: TLabel;Label25: TLabel;Label26: TLabel;LabelConnect: TLabel;Label27: TLabel;MemoGameList: TMemo;EditNoticeUrl: TEdit;Memo1: TMemo;Button2: TButton;EditClientForm: TSpinEdit;ServerSocket: TServerSocket;Timer: TTimer;GroupBox22: TGroupBox;LabelRunGate_GatePort1: TLabel;EditRunGate_GatePort1: TEdit;LabelLabelRunGate_GatePort2: TLabel;EditRunGate_GatePort2: TEdit;LabelRunGate_GatePort3: TLabel;EditRunGate_GatePort3: TEdit;LabelRunGate_GatePort4: TLabel;EditRunGate_GatePort4: TEdit;LabelRunGate_GatePort5: TLabel;EditRunGate_GatePort5: TEdit;LabelRunGate_GatePort6: TLabel;EditRunGate_GatePort6: TEdit;LabelRunGate_GatePort7: TLabel;EditRunGate_GatePort7: TEdit;EditRunGate_GatePort8: TEdit;LabelRunGate_GatePort78: TLabel;ButtonRunGateDefault: TButton;ButtonSelGateDefault: TButton;ButtonGeneralDefalult: TButton;ButtonLoginGateDefault: TButton;ButtonLoginSrvDefault: TButton;ButtonDBServerDefault: TButton;ButtonLogServerDefault: TButton;ButtonM2ServerDefault: TButton;GroupBox23: TGroupBox;Label28: TLabel;EditLoginGate_GatePort: TEdit;GroupBox24: TGroupBox;Label29: TLabel;EditSelGate_GatePort: TEdit;TabSheet15: TTabSheet;GroupBox25: TGroupBox;EditSearchLoginAccount: TEdit;Label30: TLabel;ButtonSearchLoginAccount: TButton;GroupBox26: TGroupBox;Label31: TLabel;EditLoginAccount: TEdit;Label32: TLabel;EditLoginAccountPasswd: TEdit;Label33: TLabel;EditLoginAccountUserName: TEdit;Label34: TLabel;EditLoginAccountSSNo: TEdit;Label35: TLabel;EditLoginAccountBirthDay: TEdit;Label36: TLabel;EditLoginAccountQuiz: TEdit;Label37: TLabel;EditLoginAccountAnswer: TEdit;Label38: TLabel;Label39: TLabel;EditLoginAccountQuiz2: TEdit;EditLoginAccountAnswer2: TEdit;Label40: TLabel;EditLoginAccountMobilePhone: TEdit;EditLoginAccountMemo1: TEdit;Label41: TLabel;Label42: TLabel;Label43: TLabel;EditLoginAccountEMail: TEdit;EditLoginAccountMemo2: TEdit;CkFullEditMode: TCheckBox;ButtonLoginAccountOK: TButton;Label44: TLabel;EditLoginAccountPhone: TEdit;GroupBox27: TGroupBox;CheckBoxboLoginGate_GetStart: TCheckBox;GroupBox28: TGroupBox;CheckBoxboSelGate_GetStart: TCheckBox;TabSheetDebug: TTabSheet;GroupBox29: TGroupBox;GroupBox30: TGroupBox;Label45: TLabel;EditM2CheckCodeAddr: TEdit;TimerCheckDebug: TTimer;Label46: TLabel;EditM2CheckCode: TEdit;ButtonM2Suspend: TButton;GroupBox31: TGroupBox;Label47: TLabel;Label48: TLabel;EditDBCheckCodeAddr: TEdit;EditDBCheckCode: TEdit;Button3: TButton;GroupBox32: TGroupBox;Label61: TLabel;Label62: TLabel;EditM2Server_TestLevel: TSpinEdit;EditM2Server_TestGold: TSpinEdit;Label49: TLabel;EditSelGate_GatePort1: TEdit;GroupBox33: TGroupBox;Label50: TLabel;Label51: TLabel;EditLoginServerGatePort: TEdit;EditLoginServerServerPort: TEdit;GroupBox34: TGroupBox;CheckBoxboLoginServer_GetStart: TCheckBox;GroupBox35: TGroupBox;CheckBoxDBServerGetStart: TCheckBox;GroupBox36: TGroupBox;Label52: TLabel;Label53: TLabel;EditDBServerGatePort: TEdit;EditDBServerServerPort: TEdit;GroupBox37: TGroupBox;CheckBoxLogServerGetStart: TCheckBox;GroupBox38: TGroupBox;Label54: TLabel;EditLogServerPort: TEdit;GroupBox39: TGroupBox;Label55: TLabel;EditM2ServerGatePort: TEdit;GroupBox40: TGroupBox;CheckBoxM2ServerGetStart: TCheckBox;Label56: TLabel;EditM2ServerMsgSrvPort: TEdit;Label57: TLabel;EditDBCheckStr: TEdit;Label58: TLabel;EditM2CheckStr: TEdit;GroupBox41: TGroupBox;Label59: TLabel;Label60: TLabel;Label63: TLabel;Label64: TLabel;Label65: TLabel;LabeledEdit1: TLabeledEdit;TabSheet16: TTabSheet;Label66: TLabel;Label67: TLabel;LicenseIDBox: TEdit;RegCodeBox: TEdit;DoRegistrationBtn: TButton;Label68: TLabel;OrganizationBox: TEdit;EmailBox: TEdit;Label69: TLabel;IdHTTP1: TIdHTTP;CheckBox1: TCheckBox;procedure ButtonNext1Click(Sender: TObject);procedure ButtonPrv2Click(Sender: TObject);procedure ButtonNext2Click(Sender: TObject);procedure ButtonPrv3Click(Sender: TObject);procedure ButtonSaveClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure ButtonGenGameConfigClick(Sender: TObject);procedure ButtonStartGameClick(Sender: TObject);procedure TimerStartGameTimer(Sender: TObject);procedure CheckBoxDBServerClick(Sender: TObject);procedure CheckBoxLoginServerClick(Sender: TObject);procedure CheckBoxM2ServerClick(Sender: TObject);procedure CheckBoxLogServerClick(Sender: TObject);procedure CheckBoxLoginGateClick(Sender: TObject);procedure CheckBoxSelGateClick(Sender: TObject);procedure CheckBoxRunGateClick(Sender: TObject);procedure CheckBoxRunGate1Click(Sender: TObject);procedure CheckBoxRunGate2Click(Sender: TObject);procedure TimerStopGameTimer(Sender: TObject);procedure TimerCheckRunTimer(Sender: TObject);procedure EditSkinChange(Sender: TObject);procedure ButtonFormSaveClick(Sender: TObject);procedure ButtonReLoadConfigClick(Sender: TObject);procedure EditLoginGate_MainFormXChange(Sender: TObject);procedure EditLoginGate_MainFormYChange(Sender: TObject);procedure EditSelGate_MainFormXChange(Sender: TObject);procedure EditSelGate_MainFormYChange(Sender: TObject);procedure EditLoginServer_MainFormXChange(Sender: TObject);procedure EditLoginServer_MainFormYChange(Sender: TObject);procedure EditDBServer_MainFormXChange(Sender: TObject);procedure EditDBServer_MainFormYChange(Sender: TObject);procedure EditLogServer_MainFormXChange(Sender: TObject);procedure EditLogServer_MainFormYChange(Sender: TObject);procedure EditM2Server_MainFormXChange(Sender: TObject);procedure EditM2Server_MainFormYChange(Sender: TObject);procedure MemoLogChange(Sender: TObject);procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);procedure ButtonNext3Click(Sender: TObject);procedure ButtonNext4Click(Sender: TObject);procedure ButtonNext5Click(Sender: TObject);procedure ButtonNext6Click(Sender: TObject);procedure ButtonNext7Click(Sender: TObject);procedure ButtonPrv4Click(Sender: TObject);procedure ButtonPrv5Click(Sender: TObject);procedure ButtonPrv6Click(Sender: TObject);procedure ButtonPrv7Click(Sender: TObject);procedure ButtonPrv8Click(Sender: TObject);procedure ButtonNext8Click(Sender: TObject);procedure ButtonPrv9Click(Sender: TObject);procedure EditRunGate_ConntChange(Sender: TObject);procedure ButtonLoginServerConfigClick(Sender: TObject);procedure ButtonAdvClick(Sender: TObject);procedure CheckBoxDynamicIPModeClick(Sender: TObject);procedure CheckBoxDisableAutoGameClick(Sender: TObject);procedure ServerSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);procedure ServerSocketClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);procedure ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure TimerTimer(Sender: TObject);procedure Button2Click(Sender: TObject);procedure EditNoticeUrlChange(Sender: TObject);procedure EditClientFormChange(Sender: TObject);procedure MemoGameListChange(Sender: TObject);procedure ButtonRunGateDefaultClick(Sender: TObject);procedure ButtonGeneralDefalultClick(Sender: TObject);procedure ButtonLoginGateDefaultClick(Sender: TObject);procedure ButtonSelGateDefaultClick(Sender: TObject);procedure ButtonLoginSrvDefaultClick(Sender: TObject);procedure ButtonDBServerDefaultClick(Sender: TObject);procedure ButtonLogServerDefaultClick(Sender: TObject);procedure ButtonM2ServerDefaultClick(Sender: TObject);procedure ButtonSearchLoginAccountClick(Sender: TObject);procedure CkFullEditModeClick(Sender: TObject);procedure ButtonLoginAccountOKClick(Sender: TObject);procedure EditLoginAccountChange(Sender: TObject);procedure CheckBoxboLoginGate_GetStartClick(Sender: TObject);procedure CheckBoxboSelGate_GetStartClick(Sender: TObject);procedure TimerCheckDebugTimer(Sender: TObject);procedure ButtonM2SuspendClick(Sender: TObject);procedure EditM2Server_TestLevelChange(Sender: TObject);procedure EditM2Server_TestGoldChange(Sender: TObject);procedure CheckBoxboLoginServer_GetStartClick(Sender: TObject);procedure CheckBoxDBServerGetStartClick(Sender: TObject);procedure CheckBoxLogServerGetStartClick(Sender: TObject);procedure CheckBoxM2ServerGetStartClick(Sender: TObject);procedure FormShow(Sender: TObject);procedure Label65Click(Sender: TObject);procedure FormActivate(Sender: TObject);privatem_boOpen:Boolean;m_nStartStatus:Integer;m_dwShowTick:LongWord;procedure RefGameConsole();procedure GenGameConfig();procedure GenDBServerConfig();procedure GenLoginServerConfig();procedure GenLogServerConfig();procedure GenM2ServerConfig();procedure GenLoginGateConfig();procedure GenSelGateConfig();procedure GenRunGateConfig;procedure StartGame();procedure StopGame();procedure MainOutMessage(sMsg:string);procedure ProcessDBServerMsg(wIdent:Word;sData:String); //处理来自DBSvr的消息procedure ProcessLoginSrvMsg(wIdent:Word;sData:String);procedure ProcessLoginSrvGetUserAccount(sData:String);procedure ProcessLoginSrvChangeUserAccountStatus(sData:String);procedure UserAccountEditMode(boChecked:Boolean);procedure ProcessLogServerMsg(wIdent:Word;sData:String);procedure ProcessLoginGateMsg(wIdent:Word;sData:String);procedure ProcessLoginGate1Msg(wIdent:Word;sData:String);procedure ProcessSelGateMsg(wIdent:Word;sData:String);procedure ProcessSelGate1Msg(wIdent:Word;sData:String);procedure ProcessRunGateMsg(wIdent:Word;sData:String);procedure ProcessRunGate1Msg(wIdent:Word;sData:String);procedure ProcessRunGate2Msg(wIdent:Word;sData:String);procedure ProcessRunGate3Msg(wIdent:Word;sData:String);procedure ProcessRunGate4Msg(wIdent:Word;sData:String);procedure ProcessRunGate5Msg(wIdent:Word;sData:String);procedure ProcessRunGate6Msg(wIdent:Word;sData:String);procedure ProcessRunGate7Msg(wIdent:Word;sData:String);procedure ProcessM2ServerMsg(wIdent:Word;sData:String);procedure GetMutRunGateConfing(nIndex:Integer);procedure ProcessClientPacket();procedure SendGameList(Socket:TCustomWinSocket);procedure SendSocket(Socket:TCustomWinSocket;SendMsg: String);function StartService():Boolean;procedure StopService();procedure RefGameDebug();procedure GenMutSelGateConfig(nIndex: Integer);function CheckOffline: boolean;function GetIP: string;{ Private declarations }publicprocedure ProcessMessage(var Msg: TMsg; var Handled: Boolean);procedure MyMessage(var MsgData:TWmCopyData);message WM_COPYDATA;{ Public declarations }end;varfrmMain: TfrmMain;implementationuses GShare, HUtil32, Grobal2, GLoginServer, GCertServerSet, EDcode, Share,SDK;{$R *.dfm}
{输出调试字符串}
procedure DebugOutStr (msg: string);
varflname: string;fhandle: TextFile;
begin//exit;flname := '.\!StartServer_debug.txt';if FileExists(flname) then beginAssignFile (fhandle, flname);Append (fhandle);end else beginAssignFile (fhandle, flname);Rewrite (fhandle);end;WriteLn (fhandle, TimeToStr(Time) + ' ' + msg);CloseFile (fhandle);
end;
//显示消息
procedure TfrmMain.MainOutMessage(sMsg: string);
beginsMsg:='[' + DateTimeToStr(Now) + '] ' + sMsg;MemoLog.Lines.Add(sMsg);
end;procedure TfrmMain.ButtonNext1Click(Sender: TObject);
varsGameDirectory:String;sHeroDBName:String;sM2Server_Reg,sRunGate_Reg,sDBServer_Reg:String;sGameName:String;sExtIPAddr:String;
beginsGameDirectory:=Trim(EditGameDir.Text);sHeroDBName:=Trim(EditHeroDB.Text);sM2Server_Reg:=Trim(EditM2ServerRegKey.Text);sDBServer_Reg:=Trim(EditDBServerRegKey.Text);sRunGate_Reg:=Trim(EditRunGateRegKey.Text);sGameName:=Trim(EditGameName.Text);sExtIPAddr:=Trim(EditGameExtIPaddr.Text);if sGameName = '' then beginApplication.MessageBox('游戏服务器名称输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);EditGameName.SetFocus;exit;end;if (sExtIPAddr = '') or not IsIPaddr(sExtIPAddr) then beginApplication.MessageBox('游戏服务器外部IP地址输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);EditGameExtIPaddr.SetFocus;exit;end;if (sGameDirectory = '') or not DirectoryExists(sGameDirectory) then beginApplication.MessageBox('游戏目录输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);EditGameDir.SetFocus;exit;end;if not (sGameDirectory[length(sGameDirectory)] = '\') then beginApplication.MessageBox('游戏目录名称最后一个字符必须为"\"!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);EditGameDir.SetFocus;exit;end;if sHeroDBName = '' then beginApplication.MessageBox('游戏数据库名称输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);EditHeroDB.SetFocus;exit;end;g_sM2Server_RegKey:=sM2Server_Reg;g_sRunGate_RegKey:=sRunGate_Reg;g_sDBServer_Config_RegKey:=sDBServer_Reg;g_sGameDirectory:=sGameDirectory;g_sHeroDBName:=sHeroDBName;g_sGameName:=sGameName;g_sExtIPaddr:=sExtIPAddr;g_boDynamicIPMode:=CheckBoxDynamicIPMode.Checked;PageControl3.ActivePageIndex:=1;
end;procedure TfrmMain.ButtonPrv2Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=0;
end;procedure TfrmMain.ButtonNext2Click(Sender: TObject);
varnPort:Integer;
beginnPort:=Str_ToInt(Trim(EditLoginGate_GatePort.Text),-1);if (nPort < 0) or (nPort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditLoginGate_GatePort.SetFocus;exit;end;g_nLoginGate_GatePort:=nPort;PageControl3.ActivePageIndex:=2;
end;procedure TfrmMain.ButtonPrv3Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=1;
end;
procedure TfrmMain.ButtonNext3Click(Sender: TObject);
varnPort:Integer;
beginnPort:=Str_ToInt(Trim(EditSelGate_GatePort.Text),-1);if (nPort < 0) or (nPort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditSelGate_GatePort.SetFocus;exit;end;g_nSeLGate_GatePort:=nPort;nPort:=Str_ToInt(Trim(EditSelGate_GatePort1.Text),-1);if (nPort < 0) or (nPort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditSelGate_GatePort1.SetFocus;exit;end;g_nSeLGate_GatePort1:=nPort;PageControl3.ActivePageIndex:=3;
end;procedure TfrmMain.ButtonNext4Click(Sender: TObject);
varnPort1,nPort2,nPort3,nPort4,nPort5,nPort6,nPort7,nPort8:Integer;
beginnPort1:=Str_ToInt(Trim(EditRunGate_GatePort1.Text),-1);nPort2:=Str_ToInt(Trim(EditRunGate_GatePort2.Text),-1);nPort3:=Str_ToInt(Trim(EditRunGate_GatePort3.Text),-1);nPort4:=Str_ToInt(Trim(EditRunGate_GatePort4.Text),-1);nPort5:=Str_ToInt(Trim(EditRunGate_GatePort5.Text),-1);nPort6:=Str_ToInt(Trim(EditRunGate_GatePort6.Text),-1);nPort7:=Str_ToInt(Trim(EditRunGate_GatePort7.Text),-1);nPort8:=Str_ToInt(Trim(EditRunGate_GatePort8.Text),-1);if (nPort1 < 0) or (nPort1 > 65535) then beginApplication.MessageBox('网关一端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort1.SetFocus;exit;end;if (nPort2 < 0) or (nPort2 > 65535) then beginApplication.MessageBox('网关二端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort2.SetFocus;exit;end;if (nPort3 < 0) or (nPort3 > 65535) then beginApplication.MessageBox('网关三端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort3.SetFocus;exit;end;if (nPort4 < 0) or (nPort4 > 65535) then beginApplication.MessageBox('网关四端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort4.SetFocus;exit;end;if (nPort5 < 0) or (nPort5 > 65535) then beginApplication.MessageBox('网关五端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort5.SetFocus;exit;end;if (nPort6 < 0) or (nPort6 > 65535) then beginApplication.MessageBox('网关六端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort6.SetFocus;exit;end;if (nPort7 < 0) or (nPort7 > 65535) then beginApplication.MessageBox('网关七端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort7.SetFocus;exit;end;if (nPort8 < 0) or (nPort8 > 65535) then beginApplication.MessageBox('网关八端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditRunGate_GatePort8.SetFocus;exit;end;g_nRunGate_GatePort:=nPort1;g_nRunGate1_GatePort:=nPort2;g_nRunGate2_GatePort:=nPort3;g_nRunGate3_GatePort:=nPort4;g_nRunGate4_GatePort:=nPort5;g_nRunGate5_GatePort:=nPort6;g_nRunGate6_GatePort:=nPort7;g_nRunGate7_GatePort:=nPort8;PageControl3.ActivePageIndex:=4;
end;procedure TfrmMain.ButtonNext5Click(Sender: TObject);
varnGatePort,nServerPort:Integer;
beginnGatePort:=Str_ToInt(Trim(EditLoginServerGatePort.Text),-1);nServerPort:=Str_ToInt(Trim(EditLoginServerServerPort.Text),-1);if (nGatePort < 0) or (nGatePort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditLoginServerGatePort.SetFocus;exit;end;if (nServerPort < 0) or (nServerPort > 65535) then beginApplication.MessageBox('通讯端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditLoginServerServerPort.SetFocus;exit;end;g_nLoginServer_GatePort         := nGatePort;g_nLoginServer_ServerPort       := nServerPort;PageControl3.ActivePageIndex:=5;
end;procedure TfrmMain.ButtonNext6Click(Sender: TObject);
varnGatePort,nServerPort:Integer;
beginnGatePort:=Str_ToInt(Trim(EditDBServerGatePort.Text),-1);nServerPort:=Str_ToInt(Trim(EditDBServerServerPort.Text),-1);if (nGatePort < 0) or (nGatePort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditDBServerGatePort.SetFocus;exit;end;if (nServerPort < 0) or (nServerPort > 65535) then beginApplication.MessageBox('通讯端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditDBServerServerPort.SetFocus;exit;end;g_nDBServer_Config_GatePort         := nGatePort;g_nDBServer_Config_ServerPort       := nServerPort;PageControl3.ActivePageIndex:=6;
end;procedure TfrmMain.ButtonNext7Click(Sender: TObject);
varnPort:Integer;
beginnPort:=Str_ToInt(Trim(EditLogServerPort.Text),-1);if (nPort < 0) or (nPort > 65535) then beginApplication.MessageBox('端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditLogServerPort.SetFocus;exit;end;g_nLogServer_Port:=nPort;PageControl3.ActivePageIndex:=7;
end;
procedure TfrmMain.ButtonNext8Click(Sender: TObject);
varnGatePort,nMsgSrvPort:Integer;
beginnGatePort:=Str_ToInt(Trim(EditM2ServerGatePort.Text),-1);nMsgSrvPort:=Str_ToInt(Trim(EditM2ServerMsgSrvPort.Text),-1);if (nGatePort < 0) or (nGatePort > 65535) then beginApplication.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditM2ServerGatePort.SetFocus;exit;end;if (nMsgSrvPort < 0) or (nMsgSrvPort > 65535) then beginApplication.MessageBox('通讯端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);EditM2ServerMsgSrvPort.SetFocus;exit;end;g_nM2Server_GatePort:=nGatePort;g_nM2Server_MsgSrvPort:=nMsgSrvPort;PageControl3.ActivePageIndex:=8;
end;procedure TfrmMain.ButtonPrv4Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=2;
end;procedure TfrmMain.ButtonPrv5Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=3;
end;procedure TfrmMain.ButtonPrv6Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=4;
end;procedure TfrmMain.ButtonPrv7Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=5;
end;procedure TfrmMain.ButtonPrv8Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=6;
end;procedure TfrmMain.ButtonPrv9Click(Sender: TObject);
beginPageControl3.ActivePageIndex:=7;
end;
//保存CGConfig.ini配置文件
procedure TfrmMain.ButtonSaveClick(Sender: TObject);
begin
//  ButtonSave.Enabled:=False;g_IniConf.WriteInteger('GameConf','dwStopTimeOut',g_dwStopTimeOut);g_IniConf.WriteString('GameConf','GameDirectory',g_sGameDirectory);g_IniConf.WriteString('GameConf','HeroDBName',g_sHeroDBName);g_IniConf.WriteString('GameConf','GameName',g_sGameName);g_IniConf.WriteString('GameConf','ExtIPaddr',g_sExtIPaddr);g_IniConf.WriteBool('GameConf','DynamicIPMode',g_boDynamicIPMode);g_IniConf.WriteString('DBServer','RegKey',g_sDBServer_Config_RegKey);g_IniConf.WriteString('DBServer','RegServerAddr',g_sDBServer_Config_RegServerAddr);g_IniConf.WriteInteger('DBServer','RegServerPort',g_nDBServer_Config_RegServerPort);g_IniConf.WriteInteger('DBServer','MainFormX',g_nDBServer_MainFormX);g_IniConf.WriteInteger('DBServer','MainFormY',g_nDBServer_MainFormY);g_IniConf.WriteInteger('DBServer','GatePort',g_nDBServer_Config_GatePort);g_IniConf.WriteInteger('DBServer','ServerPort',g_nDBServer_Config_ServerPort);g_IniConf.WriteBool('DBServer','DisableAutoGame',g_boDBServer_DisableAutoGame);g_IniConf.WriteBool('DBServer','GetStart',g_boDBServer_GetStart);g_IniConf.WriteString('GameServer','RegKey',g_sM2Server_RegKey);g_IniConf.WriteString('GameServer','RegServerAddr',g_sM2Server_Config_RegServerAddr);g_IniConf.WriteInteger('GameServer','RegServerPort',g_nM2Server_Config_RegServerPort);g_IniConf.WriteInteger('GameServer','MainFormX',g_nM2Server_MainFormX);g_IniConf.WriteInteger('GameServer','MainFormY',g_nM2Server_MainFormY);g_IniConf.WriteInteger('GameServer','TestLevel',g_nM2Server_TestLevel);g_IniConf.WriteInteger('GameServer','TestGold',g_nM2Server_TestGold);g_IniConf.WriteInteger('GameServer','GatePort',g_nM2Server_GatePort);g_IniConf.WriteInteger('GameServer','MsgSrvPort',g_nM2Server_MsgSrvPort);g_IniConf.WriteBool('GameServer','GetStart',g_boM2Server_GetStart);g_IniConf.WriteString('GameGate','RegKey',g_sRunGate_RegKey);g_IniConf.WriteString('GameGate','RegServerAddr',g_sRunGate_Config_RegServerAddr);g_IniConf.WriteInteger('GameGate','RegServerPort',g_nRunGate_Config_RegServerPort);g_IniConf.WriteInteger('GameGate','GatePort1',g_nRunGate_GatePort);g_IniConf.WriteInteger('GameGate','GatePort2',g_nRunGate1_GatePort);g_IniConf.WriteInteger('GameGate','GatePort3',g_nRunGate2_GatePort);g_IniConf.WriteInteger('GameGate','GatePort4',g_nRunGate3_GatePort);g_IniConf.WriteInteger('GameGate','GatePort5',g_nRunGate4_GatePort);g_IniConf.WriteInteger('GameGate','GatePort6',g_nRunGate5_GatePort);g_IniConf.WriteInteger('GameGate','GatePort7',g_nRunGate6_GatePort);g_IniConf.WriteInteger('GameGate','GatePort8',g_nRunGate7_GatePort);g_IniConf.WriteInteger('LoginGate','MainFormX',g_nLoginGate_MainFormX);g_IniConf.WriteInteger('LoginGate','MainFormY',g_nLoginGate_MainFormY);g_IniConf.WriteBool('LoginGate','GetStart',g_boLoginGate_GetStart);g_IniConf.WriteInteger('LoginGate','GatePort',g_nLoginGate_GatePort);g_IniConf.WriteInteger('SelGate','MainFormX',g_nSelGate_MainFormX);g_IniConf.WriteInteger('SelGate','MainFormY',g_nSelGate_MainFormY);g_IniConf.WriteBool('SelGate','GetStart',g_boSelGate_GetStart);g_IniConf.WriteInteger('SelGate','GatePort',g_nSelGate_GatePort);g_IniConf.WriteInteger('SelGate','GatePort1',g_nSelGate_GatePort1);g_IniConf.WriteInteger('RunGate','Count',g_nRunGate_Count);g_IniConf.WriteInteger('LoginServer','MainFormX',g_nLoginServer_MainFormX);g_IniConf.WriteInteger('LoginServer','MainFormY',g_nLoginServer_MainFormY);g_IniConf.WriteInteger('LoginServer','GatePort',g_nLoginServer_GatePort);g_IniConf.WriteInteger('LoginServer','ServerPort',g_nLoginServer_ServerPort);g_IniConf.WriteBool('LoginServer','GetStart',g_boLoginServer_GetStart);g_IniConf.WriteInteger('LogServer','MainFormX',g_nLogServer_MainFormX);g_IniConf.WriteInteger('LogServer','MainFormY',g_nLogServer_MainFormY);g_IniConf.WriteInteger('LogServer','Port',g_nLogServer_Port);g_IniConf.WriteBool('LogServer','GetStart',g_boLogServer_GetStart);Application.MessageBox('配置文件已经保存完毕...','提示信息',MB_OK + MB_ICONINFORMATION);if Application.MessageBox('是否生成新的游戏服务器配置文件...','提示信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginButtonGenGameConfigClick(ButtonGenGameConfig);end;PageControl3.ActivePageIndex:=0;PageControl1.ActivePageIndex:=0;
end;procedure TfrmMain.FormCreate(Sender: TObject);
varflname:string;F: Textfile;
beginflname := '.\!StartServer_debug.txt';if FileExists(flname) thenbeginAssignFile(F,flname );tryReset(F);CloseFile(F);Erase(F);excepton EInOutError doMessageDlg('File I/O error.', mtError, [mbOk], 0);end;end;m_boOpen:=False;
//  Application.OnMessage:=ProcessMessage;PageControl1.ActivePageIndex:=0;PageControl3.ActivePageIndex:=0;m_nStartStatus:=0; //变量初始化  第一次启动MemoLog.Clear;LoadConfig();//加载游戏管理中心配置文件
//  if not StartService() then exit;RefGameConsole();TabSheetDebug.TabVisible:=False;{ if g_boShowDebugTab then beginTabSheetDebug.TabVisible:=True;TimerCheckDebug.Enabled:=True;end; }m_boOpen:=True;MainOutMessage('《Delphi传奇》网络游戏引擎控制台已经启动...');
//  SetWindowPos(Self.Handle,HWND_TOPMOST,Self.Left,Self.Top,Self.Width,Self.Height,$40);TabSheet14.TabVisible:=False;TabSheet15.TabVisible:=False;TabSheet2.TabVisible:=False;TabSheet3.TabVisible:=False;{TabSheet4.TabVisible:=False;TabSheet5.TabVisible:=False;TabSheet6.TabVisible:=False;TabSheet7.TabVisible:=False;TabSheet8.TabVisible:=False;TabSheet9.TabVisible:=False;TabSheet10.TabVisible:=False;TabSheet11.TabVisible:=False;TabSheet12.TabVisible:=False;    }//TabSheet13.TabVisible:=False;
end;procedure TfrmMain.FormShow(Sender: TObject);
beginLicenseIDBox.Text:=MacAddress;end;procedure TfrmMain.ButtonGenGameConfigClick(Sender: TObject);
begin
//  ButtonGenGameConfig.Enabled:=False;GenGameConfig();RefGameConsole();Application.MessageBox('引擎配置文件已经生成完毕...','提示信息',MB_OK + MB_ICONINFORMATION);
end;
procedure TfrmMain.GenGameConfig;
beginGenDBServerConfig();GenLoginServerConfig();GenLogServerConfig();GenM2ServerConfig();GenLoginGateConfig();GenSelGateConfig();GenRunGateConfig();
end;
//生成DBSver配置文件,放在.\DBServer目录
procedure TfrmMain.GenDBServerConfig;
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sDBServer_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sDBServer_ConfigFile); //DB_Config.ini文件//IniGameConf.WriteString('Reg','Key',g_sDBServer_Config_RegKey);//IniGameConf.WriteString('Reg','ServerAddr',g_sDBServer_Config_RegServerAddr);//IniGameConf.WriteInteger('Reg','ServerPort',g_nDBServer_Config_RegServerPort);IniGameConf.WriteString('Setup','ServerName',g_sGameName);IniGameConf.WriteString('Setup','ServerAddr',g_sDBServer_Config_ServerAddr);IniGameConf.WriteInteger('Setup','ServerPort',g_nDBServer_Config_ServerPort);IniGameConf.WriteString('Setup','MapFile',g_sDBServer_Config_MapFile);IniGameConf.WriteBool('Setup','ViewHackMsg',g_boDBServer_Config_ViewHackMsg);IniGameConf.WriteBool('Setup','DynamicIPMode',g_boDynamicIPMode);IniGameConf.WriteBool('Setup','DisableAutoGame',g_boDBServer_DisableAutoGame);IniGameConf.WriteString('Setup','GateAddr',g_sDBServer_Config_GateAddr);IniGameConf.WriteInteger('Setup','GatePort',g_nDBServer_Config_GatePort);IniGameConf.WriteString('Server','IDSAddr',g_sLoginServer_ServerAddr);  //登录服务器IPIniGameConf.WriteInteger('Server','IDSPort',g_nLoginServer_ServerPort); //登录服务器端口IniGameConf.WriteInteger('DBClear','Interval',g_nDBServer_Config_Interval);IniGameConf.WriteInteger('DBClear','Level1',g_nDBServer_Config_Level1);IniGameConf.WriteInteger('DBClear','Level2',g_nDBServer_Config_Level2);IniGameConf.WriteInteger('DBClear','Level3',g_nDBServer_Config_Level3);IniGameConf.WriteInteger('DBClear','Day1',g_nDBServer_Config_Day1);IniGameConf.WriteInteger('DBClear','Day2',g_nDBServer_Config_Day2);IniGameConf.WriteInteger('DBClear','Day3',g_nDBServer_Config_Day3);IniGameConf.WriteInteger('DBClear','Month1',g_nDBServer_Config_Month1);IniGameConf.WriteInteger('DBClear','Month2',g_nDBServer_Config_Month2);IniGameConf.WriteInteger('DBClear','Month3',g_nDBServer_Config_Month3);{IniGameConf.WriteString('DB','Dir',sIniFile + g_sDBServer_Config_Dir);IniGameConf.WriteString('DB','IdDir',sIniFile + g_sDBServer_Config_IdDir);IniGameConf.WriteString('DB','HumDir',sIniFile + g_sDBServer_Config_HumDir);IniGameConf.WriteString('DB','FeeDir',sIniFile + g_sDBServer_Config_FeeDir);IniGameConf.WriteString('DB','BackupDir',sIniFile + g_sDBServer_Config_BackupDir);IniGameConf.WriteString('DB','ConnectDir',sIniFile + g_sDBServer_Config_ConnectDir);IniGameConf.WriteString('DB','LogDir',sIniFile + g_sDBServer_Config_LogDir); }IniGameConf.Free;SaveList:=TStringList.Create;SaveList.Add(g_sLocalIPaddr);SaveList.Add(g_sExtIPaddr);SaveList.SaveToFile(sIniFile + g_sDBServer_AddrTableFile); //!addrtable.txt '!SG_IP.txt';SaveList.Clear;case g_nRunGate_Count of    //1: SaveList.Add(format('%s %s %d',[g_sLocalIPaddr,g_sExtIPaddr,g_nRunGate_GatePort]));2: SaveList.Add(format('%s %s %d %s %d',[g_sLocalIPaddr,g_sExtIPaddr,g_nRunGate_GatePort,g_sExtIPaddr,g_nRunGate1_GatePort]));3: SaveList.Add(format('%s %s %d %s %d %s %d',[g_sLocalIPaddr,g_sExtIPaddr,g_nRunGate_GatePort,g_sExtIPaddr,g_nRunGate1_GatePort,g_sExtIPaddr,g_nRunGate2_GatePort]));else SaveList.Add(format('%s %s %d %s %d %s %d %s %d',[g_sLocalIPaddr,g_sExtIPaddr,g_nRunGate_GatePort,g_sExtIPaddr,g_nRunGate1_GatePort,g_sExtIPaddr,g_nRunGate2_GatePort,g_sExtIPaddr,g_nRunGate3_GatePort]));end;if g_nRunGate_Count > 4 thencase g_nRunGate_Count of    //5: SaveList.Add(format('%s %s %d',[g_sExtIPaddr,g_sExtIPaddr,g_nRunGate4_GatePort]));6: SaveList.Add(format('%s %s %d %s %d',[g_sExtIPaddr,g_sExtIPaddr,g_nRunGate4_GatePort,g_sExtIPaddr,g_nRunGate5_GatePort]));7: SaveList.Add(format('%s %s %d %s %d %s %d',[g_sExtIPaddr,g_sExtIPaddr,g_nRunGate4_GatePort,g_sExtIPaddr,g_nRunGate5_GatePort,g_sExtIPaddr,g_nRunGate6_GatePort]));8: SaveList.Add(format('%s %s %d %s %d %s %d %s %d',[g_sExtIPaddr,g_sExtIPaddr,g_nRunGate4_GatePort,g_sExtIPaddr,g_nRunGate5_GatePort,g_sExtIPaddr,g_nRunGate6_GatePort,g_sExtIPaddr,g_nRunGate7_GatePort]));end;SaveList.SaveToFile(sIniFile + g_sDBServer_ServerinfoFile); //!serverinfo.txt '!GG_IP.txt'SaveList.Free;//检查目录是否存在sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_Dir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_IdDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_HumDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_FeeDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_BackupDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_ConnectDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_LogDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;
end;
//生成LoginServer配置文件    LS_Config.ini
procedure TfrmMain.GenLoginServerConfig;
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sLoginServer_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile); //创建目录end;IniGameConf:=TIniFile.Create(sIniFile + g_sLoginServer_ConfigFile);IniGameConf.WriteInteger('Server','ReadyServers',g_sLoginServer_ReadyServers);IniGameConf.WriteString('Server','EnableMakingID',BoolToStr(g_sLoginServer_EnableMakingID));IniGameConf.WriteString('Server','EnableTrial',BoolToStr(g_sLoginServer_EnableTrial));IniGameConf.WriteString('Server','TestServer',BoolToStr(g_sLoginServer_TestServer));IniGameConf.WriteBool('Server','DynamicIPMode',g_boDynamicIPMode);IniGameConf.WriteString('Server','GateAddr',g_sLoginServer_GateAddr);IniGameConf.WriteInteger('Server','GatePort',g_nLoginServer_GatePort);IniGameConf.WriteString('Server','ServerAddr',g_sLoginServer_ServerAddr);IniGameConf.WriteInteger('Server','ServerPort',g_nLoginServer_ServerPort);IniGameConf.WriteString('DB','IdDir',sIniFile + g_sLoginServer_IdDir);IniGameConf.WriteString('DB','FeedIDList',sIniFile + g_sLoginServer_FeedIDList);IniGameConf.WriteString('DB','FeedIPList',sIniFile + g_sLoginServer_FeedIPList);IniGameConf.WriteString('DB','CountLogDir',sIniFile + g_sLoginServer_CountLogDir);IniGameConf.WriteString('DB','WebLogDir',sIniFile + g_sLoginServer_WebLogDir);IniGameConf.Free;SaveList:=TStringList.Create;if g_boRunGate4_GetStart then beginSaveList.Add(format('%s %s %s %s %s:%d %s:%d',[g_sGameName,'Title1',g_sLocalIPaddr,g_sLocalIPaddr,g_sExtIPaddr,g_nSelGate_GatePort,g_sExtIPaddr,g_nSelGate_GatePort1]));end else beginSaveList.Add(format('%s %s %s %s %s:%d',[g_sGameName,'Title1',g_sLocalIPaddr,g_sLocalIPaddr,g_sExtIPaddr,g_nSelGate_GatePort]));end;SaveList.SaveToFile(sIniFile + g_sLoginServer_AddrTableFile); //生成 LS_Config.ini文件SaveList.Clear;SaveList.Add(g_sLocalIPaddr);SaveList.SaveToFile(sIniFile + g_sLoginServer_ServeraddrFile);SaveList.Clear;SaveList.Add(format('%s %s %d',[g_sGameName,g_sGameName,g_nLimitOnlineUser]));SaveList.SaveToFile(sIniFile + g_sLoginServerUserLimitFile);SaveList.Free;sIniFile:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_IdDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_CountLogDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_WebLogDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;
end;
// 生成LogData.ini配置文件
procedure TfrmMain.GenLogServerConfig;
varIniGameConf:TIniFile;sIniFile:String;
beginsIniFile:=g_sGameDirectory + g_sLogServer_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sLogServer_ConfigFile);IniGameConf.WriteString('Setup','ServerName',g_sGameName);IniGameConf.WriteInteger('Setup','Port',g_nLogServer_Port);IniGameConf.WriteString('Setup','BaseDir',sIniFile + g_sLogServer_BaseDir);sIniFile:=sIniFile + g_sLogServer_BaseDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;  IniGameConf.Free;
end;
//生成!Setup.txt配置文件
procedure TfrmMain.GenM2ServerConfig;
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sM2Server_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sM2Server_ConfigFile);{IniGameConf.WriteString('Reg','Key',g_sM2Server_RegKey);IniGameConf.WriteString('Reg','IP',g_sExtIPaddr);IniGameConf.WriteString('Reg','ServerAddr',g_sM2Server_Config_RegServerAddr);IniGameConf.WriteInteger('Reg','ServerPort',g_nM2Server_Config_RegServerPort); }IniGameConf.WriteString('Server','ServerName',g_sGameName);IniGameConf.WriteInteger('Server','ServerNumber',g_nM2Server_ServerNumber);IniGameConf.WriteInteger('Server','ServerIndex',g_nM2Server_ServerIndex);IniGameConf.WriteString('Server','VentureServer',BoolToStr(g_boM2Server_VentureServer));IniGameConf.WriteString('Server','TestServer',BoolToStr(g_boM2Server_TestServer));IniGameConf.WriteInteger('Server','TestLevel',g_nM2Server_TestLevel);IniGameConf.WriteInteger('Server','TestGold',g_nM2Server_TestGold);IniGameConf.WriteInteger('Server','TestServerUserLimit',g_nLimitOnlineUser);IniGameConf.WriteString('Server','ServiceMode',BoolToStr(g_boM2Server_ServiceMode));IniGameConf.WriteString('Server','NonPKServer',BoolToStr(g_boM2Server_NonPKServer));IniGameConf.WriteString('Server','DBAddr',g_sDBServer_Config_ServerAddr);IniGameConf.WriteInteger('Server','DBPort',g_nDBServer_Config_ServerPort);IniGameConf.WriteString('Server','IDSAddr',g_sLoginServer_ServerAddr);IniGameConf.WriteInteger('Server','IDSPort',g_nLoginServer_ServerPort);IniGameConf.WriteString('Server','MsgSrvAddr',g_sM2Server_MsgSrvAddr);IniGameConf.WriteInteger('Server','MsgSrvPort',g_nM2Server_MsgSrvPort);IniGameConf.WriteString('Server','LogServerAddr',g_sLogServer_ServerAddr);IniGameConf.WriteInteger('Server','LogServerPort',g_nLogServer_Port);IniGameConf.WriteString('Server','GateAddr',g_sM2Server_GateAddr);IniGameConf.WriteInteger('Server','GatePort',g_nM2Server_GatePort);IniGameConf.WriteString('Server','DBName',g_sHeroDBName);IniGameConf.WriteInteger('Server','UserFull',g_nLimitOnlineUser);IniGameConf.WriteString('Share','BaseDir',sIniFile + g_sM2Server_BaseDir);IniGameConf.WriteString('Share','GuildDir',sIniFile + g_sM2Server_GuildDir);IniGameConf.WriteString('Share','GuildFile',sIniFile + g_sM2Server_GuildFile);IniGameConf.WriteString('Share','VentureDir',sIniFile + g_sM2Server_VentureDir);IniGameConf.WriteString('Share','ConLogDir',sIniFile + g_sM2Server_ConLogDir);IniGameConf.WriteString('Share','LogDir',sIniFile + g_sM2Server_LogDir);IniGameConf.WriteString('Share','CastleDir',sIniFile + g_sM2Server_CastleDir);IniGameConf.WriteString('Share','EnvirDir',sIniFile + g_sM2Server_EnvirDir);IniGameConf.WriteString('Share','MapDir',sIniFile + g_sM2Server_MapDir);IniGameConf.WriteString('Share','NoticeDir',sIniFile + g_sM2Server_NoticeDir);IniGameConf.Free;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_BaseDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_GuildDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_VentureDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_ConLogDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_LogDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_CastleDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_EnvirDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_MapDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_NoticeDir;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;sIniFile:=g_sGameDirectory + g_sM2Server_Directory;SaveList:=TStringList.Create;SaveList.Add('GM');SaveList.SaveToFile(sIniFile + g_sM2Server_AbuseFile);SaveList.Clear;SaveList.Add(g_sLocalIPaddr);SaveList.SaveToFile(sIniFile + g_sM2Server_RunAddrFile);SaveList.Clear;SaveList.Add(g_sLocalIPaddr);SaveList.SaveToFile(sIniFile + g_sM2Server_ServerTableFile);SaveList.Free;
end;
//生成LoginGate配置文件 LG_Config.ini
procedure TfrmMain.GenLoginGateConfig;
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sLoginGate_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sLoginGate_ConfigFile);IniGameConf.WriteString('LoginGate','Title',g_sGameName);IniGameConf.WriteString('LoginGate','ServerAddr',g_sLoginGate_ServerAddr);IniGameConf.WriteInteger('LoginGate','ServerPort',g_nLoginServer_GatePort{g_nLoginGate_ServerPort});IniGameConf.WriteString('LoginGate','GateAddr',g_sLoginGate_GateAddr);IniGameConf.WriteInteger('LoginGate','GatePort',g_nLoginGate_GatePort);IniGameConf.WriteInteger('LoginGate','ShowLogLevel',g_nLoginGate_ShowLogLevel);IniGameConf.WriteInteger('LoginGate','MaxConnOfIPaddr',g_nLoginGate_MaxConnOfIPaddr);IniGameConf.WriteInteger('LoginGate','BlockMethod',g_nLoginGate_BlockMethod);IniGameConf.WriteInteger('LoginGate','KeepConnectTimeOut',g_nLoginGate_KeepConnectTimeOut);IniGameConf.Free;
end;procedure TfrmMain.GenSelGateConfig();
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sSelGate_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sSelGate_ConfigFile);IniGameConf.WriteString('SelGate','Title',g_sGameName);IniGameConf.WriteString('SelGate','ServerAddr',g_sSelGate_ServerAddr);IniGameConf.WriteInteger('SelGate','ServerPort',g_nDBServer_Config_GatePort{g_nSelGate_ServerPort});IniGameConf.WriteString('SelGate','GateAddr',g_sSelGate_GateAddr);IniGameConf.WriteInteger('SelGate','GatePort',g_nSelGate_GatePort);IniGameConf.WriteInteger('SelGate','ShowLogLevel',g_nSelGate_ShowLogLevel);IniGameConf.WriteInteger('SelGate','MaxConnOfIPaddr',g_nSelGate_MaxConnOfIPaddr);IniGameConf.WriteInteger('SelGate','BlockMethod',g_nSelGate_BlockMethod);IniGameConf.WriteInteger('SelGate','KeepConnectTimeOut',g_nSelGate_KeepConnectTimeOut);IniGameConf.Free;
end;procedure TfrmMain.GenMutSelGateConfig(nIndex: Integer);
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;sGateAddr:String;nGatePort:Integer;sServerAddr:String;
beginsIniFile:=g_sGameDirectory + g_sSelGate_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;case nIndex of    //0: beginsGateAddr:=g_sSelGate_GateAddr;nGatePort:=g_nSelGate_GatePort;sServerAddr:=g_sLocalIPaddr;end;1: beginsGateAddr:=g_sSelGate_GateAddr1;nGatePort:=g_nSelGate_GatePort1;sServerAddr:=g_sExtIPaddr;end;end;IniGameConf:=TIniFile.Create(sIniFile + g_sSelGate_ConfigFile);IniGameConf.WriteString('SelGate','Title',g_sGameName);IniGameConf.WriteString('SelGate','ServerAddr',sServerAddr{g_sSelGate_ServerAddr});IniGameConf.WriteInteger('SelGate','ServerPort',g_nSelGate_ServerPort);IniGameConf.WriteString('SelGate','GateAddr',sGateAddr);IniGameConf.WriteInteger('SelGate','GatePort',nGatePort);IniGameConf.WriteInteger('SelGate','ShowLogLevel',g_nSelGate_ShowLogLevel);IniGameConf.WriteInteger('SelGate','MaxConnOfIPaddr',g_nSelGate_MaxConnOfIPaddr);IniGameConf.WriteInteger('SelGate','BlockMethod',g_nSelGate_BlockMethod);IniGameConf.WriteInteger('SelGate','KeepConnectTimeOut',g_nSelGate_KeepConnectTimeOut);IniGameConf.Free;
end;procedure TfrmMain.GenRunGateConfig;
varIniGameConf:TIniFile;sIniFile:String;SaveList:TStringList;
beginsIniFile:=g_sGameDirectory + g_sRunGate_Directory;if not DirectoryExists(sIniFile) then beginCreateDir(sIniFile);end;IniGameConf:=TIniFile.Create(sIniFile + g_sRunGate_ConfigFile);IniGameConf.WriteString('server','Title',g_sGameName + '(' + IntToStr(g_nRunGate_GatePort) + ')');IniGameConf.WriteString('server','Server1',g_sRunGate_ServerAddr);IniGameConf.WriteInteger('server','ServerPort',g_nM2Server_GatePort{g_nRunGate_ServerPort});IniGameConf.WriteString('server','GateAddr',g_sRunGate_GateAddr);IniGameConf.WriteInteger('server','GatePort',g_nRunGate_GatePort);IniGameConf.WriteString('Reg','RegKey',g_sRunGate_RegKey);IniGameConf.WriteString('Reg','ServerAddr',g_sRunGate_Config_RegServerAddr);IniGameConf.WriteInteger('Reg','ServerPort',g_nRunGate_Config_RegServerPort);IniGameConf.Free;
end;
//重置游戏服务器控制台
procedure TfrmMain.RefGameConsole;
beginm_boOpen:=False;EditM2ServerProgram.Text:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_ProgramFile; //OKEditDBServerProgram.Text:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_ProgramFile; //OKEditDBServerGatePort.Text:=IntToStr(g_nDBServer_Config_GatePort);//数据库服务器端口EditDBServerServerPort.Text:=IntToStr(g_nDBServer_Config_ServerPort);CheckBoxDBServerGetStart.Checked:=g_boDBServer_GetStart;EditLoginSrvProgram.Text:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_ProgramFile;EditLogServerProgram.Text:=g_sGameDirectory + g_sLogServer_Directory + g_sLogServer_ProgramFile;EditLoginGateProgram.Text:=g_sGameDirectory + g_sLoginGate_Directory + g_sLoginGate_ProgramFile;EditSelGateProgram.Text:=g_sGameDirectory + g_sSelGate_Directory + g_sSelGate_ProgramFile;EditRunGateProgram.Text:=g_sGameDirectory + g_sRunGate_Directory + g_sRunGate_ProgramFile;{ EditRunGate1Program.Text:=g_sGameDirectory + g_sRunGate_Directory + g_sRunGate_ProgramFile;EditRunGate2Program.Text:=g_sGameDirectory + g_sRunGate_Directory + g_sRunGate_ProgramFile;  }CheckBoxM2Server.Checked:=g_boM2Server_GetStart;CheckBoxM2Server.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sDBServer_Directory,g_sM2Server_ProgramFile]);CheckBoxDBServer.Checked:=g_boDBServer_GetStart;CheckBoxDBServer.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sDBServer_Directory,g_sDBServer_ProgramFile]);CheckBoxLoginServer.Checked:=g_boLoginServer_GetStart;CheckBoxLoginServer.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sLoginServer_Directory,g_sLoginServer_ProgramFile]);//不启动日志服务器// CheckBoxLogServer.Checked:=g_boLogServer_GetStart;// CheckBoxLogServer.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sDBServer_Directory,g_sLogServer_ProgramFile]);CheckBoxLoginGate.Checked:=g_boLoginGate_GetStart;CheckBoxLoginGate.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sLoginGate_Directory,g_sLoginGate_ProgramFile]);CheckBoxSelGate.Checked:=g_boSelGate_GetStart;CheckBoxSelGate.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory,g_sSelGate_Directory,g_sSelGate_ProgramFile]);CheckBoxRunGate.Checked:=g_boRunGate_GetStart;CheckBoxRunGate.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory, g_sRunGate_Directory,g_sRunGate_ProgramFile]);{ CheckBoxRunGate1.Checked:=g_boRunGate1_GetStart;CheckBoxRunGate1.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory, g_sRunGate_Directory,g_sRunGate_ProgramFile]);CheckBoxRunGate2.Checked:=g_boRunGate2_GetStart;CheckBoxRunGate2.Hint:=format('程序所在位置: %s%s%s',[g_sGameDirectory, g_sRunGate_Directory,g_sRunGate_ProgramFile]); }EditGameDir.Text:=g_sGameDirectory;EditHeroDB.Text:=g_sHeroDBName;EditGameName.Text:=g_sGameName;EditGameExtIPaddr.Text:=g_sExtIPaddr;CheckBoxDynamicIPMode.Checked:=g_boDynamicIPMode;EditGameExtIPaddr.Enabled:=not g_boDynamicIPMode;EditM2ServerRegKey.Text:=g_sM2Server_Regkey;EditRunGateRegKey.Text:=g_sRunGate_RegKey;EditDBServerRegKey.Text:=g_sDBServer_Config_RegKey;EditLoginGate_MainFormX.Value:=g_nLoginGate_MainFormX;EditLoginGate_MainFormY.Value:=g_nLoginGate_MainFormY;CheckBoxboLoginGate_GetStart.Checked:=g_boLoginGate_GetStart;EditLoginGate_GatePort.Text:=IntToStr(g_nLoginGate_GatePort);EditSelGate_MainFormX.Value:=g_nSelGate_MainFormX;EditSelGate_MainFormY.Value:=g_nSelGate_MainFormY;CheckBoxboSelGate_GetStart.Checked:=g_boSelGate_GetStart;EditSelGate_GatePort.Text:=IntToStr(g_nSelGate_GatePort);EditSelGate_GatePort1.Text:=IntToStr(g_nSelGate_GatePort1);// RunGate.nMainFormX:=g_nGameGate_MainFormX;// RunGate.nMainFormY:=g_nGameGate_MainFormY;EditRunGate_MainFormX.Value:=g_nGameGate_MainFormX;EditRunGate_MainFormY.Value:=g_nGameGate_MainFormY;EditRunGate_Connt.Value:=g_nRunGate_Count;EditRunGate_GatePort1.Text:=IntToStr(g_nRunGate_GatePort);{ EditRunGate_GatePort2.Text:=IntToStr(g_nRunGate1_GatePort);EditRunGate_GatePort3.Text:=IntToStr(g_nRunGate2_GatePort);EditRunGate_GatePort4.Text:=IntToStr(g_nRunGate3_GatePort);EditRunGate_GatePort5.Text:=IntToStr(g_nRunGate4_GatePort);EditRunGate_GatePort6.Text:=IntToStr(g_nRunGate5_GatePort);EditRunGate_GatePort7.Text:=IntToStr(g_nRunGate6_GatePort);EditRunGate_GatePort8.Text:=IntToStr(g_nRunGate7_GatePort); }EditLoginServer_MainFormX.Value:=g_nLoginServer_MainFormX;EditLoginServer_MainFormY.Value:=g_nLoginServer_MainFormY;EditLoginServerGatePort.Text:=IntToStr(g_nLoginServer_GatePort);EditLoginServerServerPort.Text:=IntToStr(g_nLoginServer_ServerPort);CheckBoxboLoginServer_GetStart.Checked:=g_boLoginServer_GetStart;EditDBServer_MainFormX.Value:=g_nDBServer_MainFormX;EditDBServer_MainFormY.Value:=g_nDBServer_MainFormY;CheckBoxDisableAutoGame.Checked:=g_boDBServer_DisableAutoGame;EditLogServer_MainFormX.Value:=g_nLogServer_MainFormX;EditLogServer_MainFormY.Value:=g_nLogServer_MainFormY;EditLogServerPort.Text:=IntToStr(g_nLogServer_Port);CheckBoxLogServerGetStart.Checked:=g_boLogServer_GetStart;EditM2Server_MainFormX.Value:=g_nM2Server_MainFormX;EditM2Server_MainFormY.Value:=g_nM2Server_MainFormY;EditM2Server_TestLevel.Value:=g_nM2Server_TestLevel;EditM2Server_TestGold.Value:=g_nM2Server_TestGold;EditM2ServerGatePort.Text:=IntToStr(g_nM2Server_GatePort);EditM2ServerMsgSrvPort.Text:=IntToStr(g_nM2Server_MsgSrvPort);CheckBoxM2ServerGetStart.Checked:=g_boM2Server_GetStart;m_boOpen:=True;
end;
procedure TfrmMain.CheckBoxDBServerClick(Sender: TObject);
beging_boDBServer_GetStart:=CheckBoxDBServer.Checked;
end;procedure TfrmMain.CheckBoxLoginServerClick(Sender: TObject);
beging_boLoginServer_GetStart:=CheckBoxLoginServer.Checked;
end;procedure TfrmMain.CheckBoxM2ServerClick(Sender: TObject);
beging_boM2Server_GetStart:=CheckBoxM2Server.Checked;
end;procedure TfrmMain.CheckBoxLogServerClick(Sender: TObject);
beging_boLogServer_GetStart:=CheckBoxLogServer.Checked;
end;procedure TfrmMain.CheckBoxLoginGateClick(Sender: TObject);
beging_boLoginGate_GetStart:=CheckBoxLoginGate.Checked;
end;procedure TfrmMain.CheckBoxSelGateClick(Sender: TObject);
beging_boSelGate_GetStart:=CheckBoxSelGate.Checked;
end;function TfrmMain.CheckOffline: boolean;
varConnectState: DWORD;StateSize: DWORD;beginConnectState:= 0;StateSize:= SizeOf(ConnectState);result:= false;if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) thenif (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true;end;function TfrmMain.GetIP: string;
varxml : OleVariant;r:string;p1,p2 : Integer;
beginxml := CreateOleObject('Microsoft.XMLHTTP');xml.Open('GET','http://www.net.cn/static/customercare/yourIP.asp', False);xml.Send;r := xml.responseText;  //接收到的文本p1:=Pos('<h2>',r); // 找到 h2 标签p2:=Pos('</h2>',r);   // 找到 h2 结束标签Result := Copy(r, p1+4, p2-p1-4);
end;
procedure TfrmMain.CheckBoxRunGateClick(Sender: TObject);
beging_boRunGate_GetStart:=CheckBoxRunGate.Checked;
end;procedure TfrmMain.CheckBoxRunGate1Click(Sender: TObject);
beging_boRunGate1_GetStart:=CheckBoxRunGate1.Checked;
end;procedure TfrmMain.CheckBoxRunGate2Click(Sender: TObject);
beging_boRunGate2_GetStart:=CheckBoxRunGate2.Checked;
end;
//启动
procedure TfrmMain.ButtonStartGameClick(Sender: TObject);
varConf:TIniFile;sConfigFileName,IPAddr:String;Conf1:TIniFile;sConfigFileName1:String;
begin
//if m_nStartStatus = 0 thenbegin//首先尝试获取公网IP地址if not CheckBox1.Checked thenbeginShellExecute(Application.Handle, nil, Pchar('http://www.net.cn/static/customercare/yourIP.asp'), nil,nil, SW_SHOWNOACTIVATE);tryfrmMain.Cursor:=crHourGlass;if CheckOffline and InternetCheckConnection('http://www.net.cn/', 1, 0) thenbeginLabeledEdit1.text:= GetIP  ;sConfigFileName1:='D:\MMORPGServer\公网IP地址.ini';Conf1        := TIniFile.Create(sConfigFileName1);Conf1.WriteString('IPAddr','ServerIPAddr',LabeledEdit1.text);Conf1.Free;endelseshowmessage('无法获取IP地址,请确定您能够正常上网,并检查代理和防火墙设置!'+#13+'确认设置正确后,关闭并且重新启动引擎!');frmMain.Cursor:=crDefault;exceptshowmessage('无法获取IP地址,请确定您能够正常上网,并检查代理和防火墙设置!'+#13+'确认设置正确后,关闭并且重新启动引擎!');LabeledEdit1.Text :='127.0.0.1';end;end else LabeledEdit1.Text :='127.0.0.1';if LabeledEdit1.Text <> '' thenbeging_sServerAddr:=LabeledEdit1.Text;g_IniConf.WriteString('Client','ServerAddr',g_sServerAddr);sConfigFileName:='D:\MMORPGServer\公网IP地址.ini';Conf        := TIniFile.Create(sConfigFileName);Conf.WriteString('IPAddr','ServerIPAddr',LabeledEdit1.text);Conf.Free;end;  //以上是ADSL免费版{//下面是正式版本,因为正式版本专用机房服务器是映射的IP地址,所以需要手工配置各个服务端if LabeledEdit1.Text <> '' thenbeging_sServerAddr:=LabeledEdit1.Text;g_IniConf.WriteString('Client','ServerAddr',g_sServerAddr);end;    }end;
///if not StartService() then exit;SetWindowPos(Self.Handle,Self.Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);//设置自身窗口显示位置case m_nStartStatus of0: begin //创建时的初始化数值,第一次启动// DebugOutStr('ButtonStartGameClick 0: begin');//  if Application.MessageBox('是否确认启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginStartGame();// end;end;1: begin// if Application.MessageBox('是否确认中止启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginTimerStartGame.Enabled:=False;m_nStartStatus:=2;ButtonStartGame.Caption:=g_sButtonStopGame;// end;end;2: begin// if Application.MessageBox('是否确认停止游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginStopGame();//  end;end;3: begin//if Application.MessageBox('是否确认中止启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginTimerStopGame.Enabled:=False;m_nStartStatus:=2;ButtonStartGame.Caption:=g_sButtonStopGame;// end;end;end;{if CreateProcess(nil,PChar(sProgamFile),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,StartUpInfo,ProcessInfo) then begin}
end;
//启动服务器程序   单击启动按钮调用
procedure TfrmMain.StartGame;
varnRetCode:Integer;
begin
//启动DB Server服务器FillChar(DBServer,SizeOf(TProgram),#0);DBServer.boGetStart:=g_boDBServer_GetStart;DBServer.boReStart:=True;DBServer.sDirectory:=g_sGameDirectory + g_sDBServer_Directory;DBServer.sProgramFile:=g_sDBServer_ProgramFile;DBServer.nMainFormX:=g_nDBServer_MainFormX;DBServer.nMainFormY:=g_nDBServer_MainFormY;
//启动Login Server服务器FillChar(LoginServer,SizeOf(TProgram),#0);LoginServer.boGetStart:=g_boLoginServer_GetStart;LoginServer.boReStart:=True;LoginServer.sDirectory:=g_sGameDirectory + g_sLoginServer_Directory;LoginServer.sProgramFile:=g_sLoginServer_ProgramFile;LoginServer.nMainFormX:=g_nLoginServer_MainFormX;LoginServer.nMainFormY:=g_nLoginServer_MainFormY;
//启动Log Server日志服务器 { FillChar(LogServer,SizeOf(TProgram),#0);LogServer.boGetStart:=g_boLogServer_GetStart;LogServer.boReStart:=True;LogServer.sDirectory:=g_sGameDirectory + g_sLogServer_Directory;LogServer.sProgramFile:=g_sLogServer_ProgramFile;LogServer.nMainFormX:=g_nLogServer_MainFormX;LogServer.nMainFormY:=g_nLogServer_MainFormY;   }//DebugOutStr(g_sGameDirectory + g_sLogServer_Directory +g_sLogServer_ProgramFile );
//启动Game Server游戏主服务器FillChar(M2Server,SizeOf(TProgram),#0);M2Server.boGetStart:=g_boM2Server_GetStart;M2Server.boReStart:=True;M2Server.sDirectory:=g_sGameDirectory + g_sM2Server_Directory;M2Server.sProgramFile:=g_sM2Server_ProgramFile;M2Server.nMainFormX:=g_nM2Server_MainFormX;M2Server.nMainFormY:=g_nM2Server_MainFormY;// DebugOutStr('启动Game Server游戏主服务器'+M2Server.sDirectory+M2Server.sProgramFile);//启动Run Gate //Game Gate游戏网关服务器  Game GateFillChar(RunGate,SizeOf(TProgram),#0);RunGate.boGetStart:=g_boRunGate_GetStart;RunGate.boReStart:=True;RunGate.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate.sProgramFile:=g_sRunGate_ProgramFile;RunGate.nMainFormX:=g_nGameGate_MainFormX;//showmessage(inttostr(g_nGameGate_MainFormX));RunGate.nMainFormY:=g_nGameGate_MainFormY;//showmessage(inttostr(g_nGameGate_MainFormY));{FillChar(RunGate1,SizeOf(TProgram),#0);RunGate1.boGetStart:=g_boRunGate1_GetStart;RunGate1.boReStart:=True;RunGate1.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate1.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate2,SizeOf(TProgram),#0);RunGate2.boGetStart:=g_boRunGate2_GetStart;RunGate2.boReStart:=True;RunGate2.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate2.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate3,SizeOf(TProgram),#0);RunGate3.boGetStart:=g_boRunGate3_GetStart;RunGate3.boReStart:=True;RunGate3.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate3.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate4,SizeOf(TProgram),#0);RunGate4.boGetStart:=g_boRunGate4_GetStart;RunGate4.boReStart:=True;RunGate4.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate4.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate5,SizeOf(TProgram),#0);RunGate5.boGetStart:=g_boRunGate5_GetStart;RunGate5.boReStart:=True;RunGate5.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate5.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate6,SizeOf(TProgram),#0);RunGate6.boGetStart:=g_boRunGate6_GetStart;RunGate6.boReStart:=True;RunGate6.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate6.sProgramFile:=g_sRunGate_ProgramFile;FillChar(RunGate7,SizeOf(TProgram),#0);RunGate7.boGetStart:=g_boRunGate7_GetStart;RunGate7.boReStart:=True;RunGate7.sDirectory:=g_sGameDirectory + g_sRunGate_Directory;RunGate7.sProgramFile:=g_sRunGate_ProgramFile;}//SelGate网关FillChar(SelGate,SizeOf(TProgram),#0);SelGate.boGetStart:=g_boSelGate_GetStart;SelGate.boReStart:=True;SelGate.sDirectory:=g_sGameDirectory + g_sSelGate_Directory;SelGate.sProgramFile:=g_sSelGate_ProgramFile;SelGate.nMainFormX:=g_nSelGate_MainFormX;SelGate.nMainFormY:=g_nSelGate_MainFormY;{ FillChar(SelGate1,SizeOf(TProgram),#0);if g_boRunGate4_GetStart then begin //如果设置了4开游戏网关以上则打开第二个角色网关SelGate1.boGetStart:=g_boSelGate_GetStart;end else SelGate1.boGetStart:=False;SelGate1.boReStart:=True;SelGate1.sDirectory:=g_sGameDirectory + g_sSelGate_Directory;SelGate1.sProgramFile:=g_sSelGate_ProgramFile;SelGate1.nMainFormX:=g_nSelGate_MainFormX;SelGate1.nMainFormY:=g_nSelGate_MainFormY; }//启动LoginGate服务器FillChar(LoginGate,SizeOf(TProgram),#0);LoginGate.boGetStart:=g_boLoginGate_GetStart;//if LoginGate.boGetStart then  ShowMessage('true');LoginGate.boReStart:=True;LoginGate.sDirectory:=g_sGameDirectory + g_sLoginGate_Directory;LoginGate.sProgramFile:=g_sLoginGate_ProgramFile;LoginGate.nMainFormX:=g_nLoginGate_MainFormX;LoginGate.nMainFormY:=g_nLoginGate_MainFormY;//DebugOutStr('启动LoginGate服务器'+LoginGate.sDirectory+LoginGate.sProgramFile);ButtonStartGame.Caption:=g_sButtonStopStartGame;m_nStartStatus:=1;TimerStartGame.Enabled:=True;//启动定时器 由定时器启动服务器程序
end;procedure TfrmMain.StopGame;
beginButtonStartGame.Caption:=g_sButtonStopStopGame;MainOutMessage('正在开始关闭服务器程序...');TimerCheckRun.Enabled:=False;TimerStopGame.Enabled:=True;m_nStartStatus:=3;ServerSocket.Active:=False;
end;
//改变启动服务器程序顺序可能导致有的服务器程序不能启动
procedure TfrmMain.TimerStartGameTimer(Sender: TObject);   //原来200
varnRetCode:Integer;
begin{  if LogServer.boGetStart then begincase LogServer.btStartStatus of    //0: beginnRetCode:=RunProgram(LogServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginLogServer.btStartStatus:=1;LogServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LogServer.ProcessInfo.dwProcessId);end else beginLogServer.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        LogServer.btStartStatus:=2;exit;end;end;end;  }if LoginServer.boGetStart then begincase LoginServer.btStartStatus of    //0: beginnRetCode:=RunProgram(LoginServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginLoginServer.btStartStatus:=1;LoginServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginServer.ProcessInfo.dwProcessId);end else beginLoginServer.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        LoginServer.btStartStatus:=2;exit;end;end;end;if LoginGate.boGetStart then begin  //原来LG放在末尾启动导致不能启动LG 现在用d007编译后不能启动剩下的其他程序//DebugOutStr('if LoginGate.boGetStart then begin');case LoginGate.btStartStatus of    //0: begin//DebugOutStr('0: begin');nRetCode:=RunProgram(LoginGate,IntToStr(Self.Handle),0);if nRetCode = 0 then beginLoginGate.btStartStatus:=1;LoginGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginGate.ProcessInfo.dwProcessId);end else beginLoginGate.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        LoginGate.btStartStatus:=2;exit;end;end;end;if DBServer.boGetStart then begincase DBServer.btStartStatus of    //0: beginnRetCode:=RunProgram(DBServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginDBServer.btStartStatus:=1;DBServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,DBServer.ProcessInfo.dwProcessId);end else beginShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        DBServer.btStartStatus:=2;exit;end;end;end;if M2Server.boGetStart then begin//DebugOutStr('if M2Server.boGetStart then begin ');case M2Server.btStartStatus of    //0: begin//DebugOutStr('if M2Server.boGetStart then begin 0: begin');nRetCode:=RunProgram(M2Server,IntToStr(Self.Handle),0);if nRetCode = 0 then beginM2Server.btStartStatus:=1;M2Server.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,M2Server.ProcessInfo.dwProcessId);end else beginM2Server.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        M2Server.btStartStatus:=2;exit;end;end;end;//GameGate网关if RunGate.boGetStart then begincase RunGate.btStartStatus of    //0: begin// GetMutRunGateConfing(0);//如果存在多个GameGate网关则调用该函数                              nRetCode:=RunProgram(RunGate,IntToStr(Self.Handle),2000); //为什么2000?if nRetCode = 0 then beginRunGate.btStartStatus:=1;//DebugOutStr( IntToStr(RunGate.nMainFormX)+'///'+IntToStr(RunGate.nMainFormy) );RunGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate.ProcessInfo.dwProcessId);end else beginRunGate.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate.btStartStatus:=2;// exit;end;end;end;{if RunGate1.boGetStart then begincase RunGate1.btStartStatus of    //0: beginGetMutRunGateConfing(1);nRetCode:=RunProgram(RunGate1,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate1.btStartStatus:=1;RunGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate1.ProcessInfo.dwProcessId);end else beginRunGate1.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate1.btStartStatus:=2;
//        exit;end;end;end;if RunGate2.boGetStart then begincase RunGate2.btStartStatus of    //0: beginGetMutRunGateConfing(2);nRetCode:=RunProgram(RunGate2,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate2.btStartStatus:=1;RunGate2.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate2.ProcessInfo.dwProcessId);end else beginRunGate2.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate2.btStartStatus:=2;
//        exit;end;end;end;if RunGate3.boGetStart then begincase RunGate3.btStartStatus of    //0: beginGetMutRunGateConfing(3);nRetCode:=RunProgram(RunGate3,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate3.btStartStatus:=1;RunGate3.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate3.ProcessInfo.dwProcessId);end else beginRunGate3.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate3.btStartStatus:=2;
//        exit;end;end;end;if RunGate4.boGetStart then begincase RunGate4.btStartStatus of    //0: beginGetMutRunGateConfing(4);nRetCode:=RunProgram(RunGate4,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate4.btStartStatus:=1;RunGate4.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate4.ProcessInfo.dwProcessId);end else beginRunGate4.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate4.btStartStatus:=2;
//        exit;end;end;end;if RunGate5.boGetStart then begincase RunGate5.btStartStatus of    //0: beginGetMutRunGateConfing(5);nRetCode:=RunProgram(RunGate5,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate5.btStartStatus:=1;RunGate5.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate5.ProcessInfo.dwProcessId);end else beginRunGate5.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate5.btStartStatus:=2;
//        exit;end;end;end;if RunGate6.boGetStart then begincase RunGate6.btStartStatus of    //0: beginGetMutRunGateConfing(6);nRetCode:=RunProgram(RunGate6,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate6.btStartStatus:=1;RunGate6.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate6.ProcessInfo.dwProcessId);end else beginRunGate6.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate6.btStartStatus:=2;
//        exit;end;end;end;if RunGate7.boGetStart then begincase RunGate7.btStartStatus of    //0: beginGetMutRunGateConfing(7);nRetCode:=RunProgram(RunGate7,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginRunGate7.btStartStatus:=1;RunGate7.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate7.ProcessInfo.dwProcessId);end else beginRunGate7.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成RunGate7.btStartStatus:=2;
//        exit;end;end;end;  }if SelGate.boGetStart then begincase SelGate.btStartStatus of    //0: begin//DebugOutStr('case SelGate.btStartStatus of');GenMutSelGateConfig(0);nRetCode:=RunProgram(SelGate,IntToStr(Self.Handle),0);if nRetCode = 0 then beginSelGate.btStartStatus:=1;SelGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate.ProcessInfo.dwProcessId);end else beginSelGate.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        SelGate.btStartStatus:=2;exit;end;end;end;{if SelGate1.boGetStart then begincase SelGate1.btStartStatus of    //0: beginGenMutSelGateConfig(1);nRetCode:=RunProgram(SelGate1,IntToStr(Self.Handle),0);if nRetCode = 0 then beginSelGate1.btStartStatus:=1;SelGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate1.ProcessInfo.dwProcessId);end else beginSelGate1.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        SelGate1.btStartStatus:=2;exit;end;end;end; }{ //DebugOutStr(' begin');if LoginGate.boGetStart then begin  //原来LG放在末尾启动导致不能启动LG 现在用d007编译后不能启动剩下的其他程序//DebugOutStr('if LoginGate.boGetStart then begin');case LoginGate.btStartStatus of    //0: begin// DebugOutStr('0: begin');nRetCode:=RunProgram(LoginGate,IntToStr(Self.Handle),0);if nRetCode = 0 then beginLoginGate.btStartStatus:=1;LoginGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginGate.ProcessInfo.dwProcessId);end else beginLoginGate.btStartStatus:=9;ShowMessage(IntToStr(nRetCode));end;exit;end;1: begin  //如果状态为1 则还没启动完成
//        LoginGate.btStartStatus:=2;exit;end;end;end else//DebugOutStr('else'); }TimerStartGame.Enabled:=False;  //不用该计时器启动,因为可能还没有启动全部程序,计时器就关闭了。TimerCheckRun.Enabled:=True;ButtonStartGame.Caption:=g_sButtonStopGame;
//  ButtonStartGame.Enabled:=True;m_nStartStatus:=2;
//  SetWindowPos(Self.Handle,HWND_TOPMOST,Self.Left,Self.Top,Self.Width,Self.Height,$40);
end;procedure TfrmMain.TimerStopGameTimer(Sender: TObject);
vardwExitCode:LongWord;nRetCode:Integer;
beginif LoginGate.boGetStart and (LoginGate.btStartStatus in [2,3]) then beginGetExitCodeProcess(LoginGate.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif LoginGate.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(LoginGate,0);MainOutMessage('正常关闭超时,登录网关已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(LoginGate.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();LoginGate.btStartStatus := 3;exit;end else beginCloseHandle(LoginGate.ProcessHandle);LoginGate.btStartStatus:=0;MainOutMessage('登录网关已关闭...');end;end;if SelGate.boGetStart and (SelGate.btStartStatus in [2,3]) then beginGetExitCodeProcess(SelGate.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif SelGate.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(SelGate,0);MainOutMessage('正常关闭超时,角色网关已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(SelGate.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();SelGate.btStartStatus := 3;exit;end else beginCloseHandle(SelGate.ProcessHandle);SelGate.btStartStatus:=0;MainOutMessage('角色网关已关闭...');end;end;if RunGate.boGetStart and (RunGate.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate,2000);if nRetCode = 0 then beginCloseHandle(RunGate.ProcessHandle);RunGate.btStartStatus:=0;MainOutMessage('游戏网关一已关闭...');end;end;end;{ if RunGate1.boGetStart and (RunGate1.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate1.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate1,2000);if nRetCode = 0 then beginCloseHandle(RunGate1.ProcessHandle);RunGate1.btStartStatus:=0;MainOutMessage('游戏网关二已停止...');end;end;end;if RunGate2.boGetStart and (RunGate2.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate2.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate2,2000);if nRetCode = 0 then beginCloseHandle(RunGate2.ProcessHandle);RunGate2.btStartStatus:=0;MainOutMessage('游戏网关三已停止...');end;end;end;if RunGate3.boGetStart and (RunGate3.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate3.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate3,2000);if nRetCode = 0 then beginCloseHandle(RunGate3.ProcessHandle);RunGate3.btStartStatus:=0;MainOutMessage('游戏网关四已停止...');end;end;end;if RunGate4.boGetStart and (RunGate4.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate4.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate4,2000);if nRetCode = 0 then beginCloseHandle(RunGate4.ProcessHandle);RunGate4.btStartStatus:=0;MainOutMessage('游戏网关五已停止...');end;end;end;if RunGate5.boGetStart and (RunGate5.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate5.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate5,2000);if nRetCode = 0 then beginCloseHandle(RunGate5.ProcessHandle);RunGate5.btStartStatus:=0;MainOutMessage('游戏网关六已停止...');end;end;end;if RunGate6.boGetStart and (RunGate6.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate6.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate6,2000);if nRetCode = 0 then beginCloseHandle(RunGate6.ProcessHandle);RunGate6.btStartStatus:=0;MainOutMessage('游戏网关七已停止...');end;end;end;if RunGate7.boGetStart and (RunGate7.btStartStatus in [2,3]) then beginGetExitCodeProcess(RunGate7.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginnRetCode:=StopProgram(RunGate7,2000);if nRetCode = 0 then beginCloseHandle(RunGate7.ProcessHandle);RunGate7.btStartStatus:=0;MainOutMessage('游戏网关八已停止...');end;end;end;   }if M2Server.boGetStart and (M2Server.btStartStatus in [2,3]) then beginGetExitCodeProcess(M2Server.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif M2Server.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(M2Server,1000);MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(M2Server.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();M2Server.btStartStatus := 3;exit;end else beginCloseHandle(M2Server.ProcessHandle);M2Server.btStartStatus:=0;MainOutMessage('游戏引擎主系统程序已关闭...');end;end;if LoginServer.boGetStart and (LoginServer.btStartStatus in [2,3]) then beginGetExitCodeProcess(LoginServer.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif LoginServer.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(LoginServer,1000);MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(LoginServer.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();LoginServer.btStartStatus := 3;exit;end else beginCloseHandle(LoginServer.ProcessHandle);LoginServer.btStartStatus:=0;MainOutMessage('登录服务器已关闭...');end;end;if LogServer.boGetStart and (LogServer.btStartStatus in [2,3]) then beginGetExitCodeProcess(LogServer.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif LogServer.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(LogServer,0);MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(LogServer.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();LogServer.btStartStatus := 3;exit;end else beginCloseHandle(LogServer.ProcessHandle);LogServer.btStartStatus:=0;MainOutMessage('游戏日志服务器已关闭...');end;end;if DBServer.boGetStart and (DBServer.btStartStatus in [2,3]) then beginGetExitCodeProcess(DBServer.ProcessHandle,dwExitCode);if dwExitCode = STILL_ACTIVE then beginif DBServer.btStartStatus = 3 then beginif GetTickCount - g_dwStopTick > g_dwStopTimeOut then beginStopProgram(DBServer,0);MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');end;exit; //如果正在关闭则等待,不处理下面end;SendProgramMsg(DBServer.MainFormHandle,GS_QUIT,'');g_dwStopTick:=GetTickCount();DBServer.btStartStatus := 3;exit;end else beginCloseHandle(DBServer.ProcessHandle);DBServer.btStartStatus:=0;MainOutMessage('游戏数据库服务器已关闭...');end;end;TimerStopGame.Enabled:=False;ButtonStartGame.Caption:=g_sButtonStartGame;m_nStartStatus:=0;
end;procedure TfrmMain.TimerCheckRunTimer(Sender: TObject);
vardwExitCode:LongWord;nRetCode:Integer;
beginif DBServer.boGetStart then beginGetExitCodeProcess(DBServer.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(DBServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(DBServer.ProcessHandle);DBServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,DBServer.ProcessInfo.dwProcessId);MainOutMessage('数据库异常关闭,已被重新启动...');end;end;end;if LoginServer.boGetStart then beginGetExitCodeProcess(LoginServer.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(LoginServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(LoginServer.ProcessHandle);LoginServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginServer.ProcessInfo.dwProcessId);MainOutMessage('登录服务器异常关闭,已被重新启动...');end;end;end;if LogServer.boGetStart then beginGetExitCodeProcess(LogServer.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(LogServer,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(LogServer.ProcessHandle);LogServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LogServer.ProcessInfo.dwProcessId);MainOutMessage('日志服务器异常关闭,已被重新启动...');end;end;end;if M2Server.boGetStart then beginGetExitCodeProcess(M2Server.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(M2Server,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(M2Server.ProcessHandle);M2Server.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,M2Server.ProcessInfo.dwProcessId);MainOutMessage('游戏引擎服务器异常关闭,已被重新启动...');end;end;end;if RunGate.boGetStart then beginGetExitCodeProcess(RunGate.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginGetMutRunGateConfing(0);nRetCode:=RunProgram(RunGate,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginCloseHandle(RunGate.ProcessHandle);RunGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate.ProcessInfo.dwProcessId);MainOutMessage('游戏网关一异常关闭,已被重新启动...');end;end;end;{ if RunGate1.boGetStart then beginGetExitCodeProcess(RunGate1.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginGetMutRunGateConfing(1);nRetCode:=RunProgram(RunGate1,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginCloseHandle(RunGate1.ProcessHandle);RunGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate1.ProcessInfo.dwProcessId);MainOutMessage('游戏网关二异常关闭,已被重新启动...');end;end;end;if RunGate2.boGetStart then beginGetExitCodeProcess(RunGate2.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginGetMutRunGateConfing(2);nRetCode:=RunProgram(RunGate2,IntToStr(Self.Handle),2000);if nRetCode = 0 then beginCloseHandle(RunGate2.ProcessHandle);RunGate2.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate2.ProcessInfo.dwProcessId);MainOutMessage('游戏网关三异常关闭,已被重新启动...');end;end;end;   }if SelGate.boGetStart then beginGetExitCodeProcess(SelGate.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(SelGate,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(SelGate.ProcessHandle);SelGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate.ProcessInfo.dwProcessId);MainOutMessage('角色网关异常关闭,已被重新启动...');end;end;end;if LoginGate.boGetStart then beginGetExitCodeProcess(LoginGate.ProcessHandle,dwExitCode);if dwExitCode <> STILL_ACTIVE then beginnRetCode:=RunProgram(LoginGate,IntToStr(Self.Handle),0);if nRetCode = 0 then beginCloseHandle(LoginGate.ProcessHandle);LoginGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginGate.ProcessInfo.dwProcessId);MainOutMessage('登录网关异常关闭,已被重新启动...');end;end;end;
end;procedure TfrmMain.ProcessMessage(var Msg: TMsg; var Handled: Boolean);
begin{ if Msg.message =  WM_SENDPROCMSG then begin//  WM_SENDPROCMSG  未定义暂时屏蔽
//    ShowMessage('asfd');Handled:=true;end; }
end;procedure TfrmMain.MyMessage(var MsgData: TWmCopyData);
varsData:String;ProgramType:TProgamType;wIdent:Word;
beginwIdent:=HiWord(MsgData.From);ProgramType:=TProgamType(LoWord(MsgData.From));sData:=StrPas(MsgData.CopyDataStruct^.lpData);case ProgramType of    //发送消息的程序类型tDBServer: ProcessDBServerMsg(wIdent,sData);//DBS数据库服务器tLoginSrv: ProcessLoginSrvMsg(wIdent,sData);tLogServer: ProcessLogServerMsg(wIdent,sData);tM2Server:  ProcessM2ServerMsg(wIdent,sData); //GS游戏引擎tLoginGate: ProcessLoginGateMsg(wIdent,sData);// tLoginGate1: ProcessLoginGate1Msg(wIdent,sData);tSelGate: ProcessSelGateMsg(wIdent,sData);tSelGate1: ProcessSelGate1Msg(wIdent,sData);// tRunGate:  ProcessRunGateMsg(wIdent,sData);// tRunGate1: ProcessRunGate1Msg(wIdent,sData);// tRunGate2: ProcessRunGate2Msg(wIdent,sData);// tRunGate3: ProcessRunGate3Msg(wIdent,sData);//tRunGate4: ProcessRunGate4Msg(wIdent,sData);// tRunGate5: ProcessRunGate5Msg(wIdent,sData);// tRunGate6: ProcessRunGate6Msg(wIdent,sData);// tRunGate7: ProcessRunGate7Msg(wIdent,sData);end;
end;procedure TfrmMain.ProcessDBServerMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginDBServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: beginMainOutMessage(sData);end;SG_STARTOK: beginDBServer.btStartStatus:=2;MainOutMessage(sData);end;SG_CHECKCODEADDR: beging_dwDBCheckCodeAddr:=Str_ToInt(sData,-1);end;3: ;end;
end;procedure TfrmMain.ProcessLoginGateMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginLoginGate.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: beginMainOutMessage(sData);end;SG_STARTOK: beginLoginGate.btStartStatus:=2;MainOutMessage(sData);end;2: ;3: ;end;
end;procedure TfrmMain.ProcessLoginGate1Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginLoginGate1.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;1: ;2: ;3: ;end;
end;procedure TfrmMain.ProcessSelGateMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginSelGate.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: beginMainOutMessage(sData);end;SG_STARTOK: beginif SelGate.btStartStatus <> 2 then beginSelGate.btStartStatus:=2;end else beginSelGate1.btStartStatus:=2;end;MainOutMessage(sData);end;end;
end;procedure TfrmMain.ProcessSelGate1Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginSelGate1.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessM2ServerMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginM2Server.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: begin //GameServer启动后发送该消息在这里处理MainOutMessage(sData);end;SG_STARTOK: beginM2Server.btStartStatus:=2;MainOutMessage(sData);end;SG_CHECKCODEADDR: beging_dwM2CheckCodeAddr:=Str_ToInt(sData,-1);end;end;end;//sData参数是由对应的服务器程序传递过来的
procedure TfrmMain.ProcessLoginSrvMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginLoginServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: beginMainOutMessage(sData); //显示消息end;SG_STARTOK: beginLoginServer.btStartStatus:=2;MainOutMessage(sData);end;SG_USERACCOUNT: beginProcessLoginSrvGetUserAccount(sData);end;SG_USERACCOUNTCHANGESTATUS: beginProcessLoginSrvChangeUserAccountStatus(sData);end;end;end;procedure TfrmMain.ProcessLogServerMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginLogServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;SG_STARTNOW: beginMainOutMessage(sData);end;SG_STARTOK: beginLogServer.btStartStatus:=2;MainOutMessage(sData);end;end;end;procedure TfrmMain.ProcessRunGate1Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate1.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate2Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate2.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate3Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate3.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate4Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate4.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate5Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate5.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate6Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate6.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGate7Msg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate7.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.ProcessRunGateMsg(wIdent: Word; sData: String);
varHandle:THandle;
begincase wIdent ofSG_FORMHANDLE: beginHandle:=Str_ToInt(sData,0);if Handle <> 0 then beginRunGate.MainFormHandle:=Handle;end;end;1: ;2: ;3: ;end;end;procedure TfrmMain.EditSkinChange(Sender: TObject);
begin{ if EditSkin.Text = '' then beginEditSkin.Text:='0';end;if not m_boOpen then exit;g_nFormIdx:=EditSkin.Value;if g_nFormIdx >= 0 then beginSkinData.LoadFromCollection(SkinStore,g_nFormIdx);if not SkinData.Active then SkinData.Active:=True;end else beginSkinData.Active:=False;end;ButtonFormSave.Enabled:=True; }
end;procedure TfrmMain.ButtonFormSaveClick(Sender: TObject);
begin{ButtonFormSave.Enabled:=False;g_IniConf.WriteInteger('Setup','FormID',g_nFormIdx); }
end;procedure TfrmMain.ButtonReLoadConfigClick(Sender: TObject);
beginLoadConfig();RefGameConsole();Application.MessageBox('配置重加载完成...','提示信息',MB_OK + MB_ICONINFORMATION);
end;procedure TfrmMain.EditLoginGate_MainFormXChange(Sender: TObject);
beginif EditLoginGate_MainFormX.Text = '' then beginEditLoginGate_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nLoginGate_MainFormX:=EditLoginGate_MainFormX.Value;
end;procedure TfrmMain.EditLoginGate_MainFormYChange(Sender: TObject);
beginif EditLoginGate_MainFormY.Text = '' then beginEditLoginGate_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nLoginGate_MainFormY:=EditLoginGate_MainFormY.Value;
end;procedure TfrmMain.CheckBoxboLoginGate_GetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boLoginGate_GetStart:=CheckBoxboLoginGate_GetStart.Checked;
end;procedure TfrmMain.EditSelGate_MainFormXChange(Sender: TObject);
beginif EditSelGate_MainFormX.Text = '' then beginEditSelGate_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nSelGate_MainFormX:=EditSelGate_MainFormX.Value;
end;procedure TfrmMain.EditSelGate_MainFormYChange(Sender: TObject);
beginif EditSelGate_MainFormY.Text = '' then beginEditSelGate_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nSelGate_MainFormY:=EditSelGate_MainFormY.Value;
end;procedure TfrmMain.CheckBoxboSelGate_GetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boSelGate_GetStart:=CheckBoxboSelGate_GetStart.Checked;
end;
procedure TfrmMain.EditLoginServer_MainFormXChange(Sender: TObject);
beginif EditLoginServer_MainFormX.Text = '' then beginEditLoginServer_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nLoginServer_MainFormX:=EditLoginServer_MainFormX.Value;
end;procedure TfrmMain.EditLoginServer_MainFormYChange(Sender: TObject);
beginif EditLoginServer_MainFormY.Text = '' then beginEditLoginServer_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nLoginServer_MainFormY:=EditLoginServer_MainFormY.Value;
end;procedure TfrmMain.CheckBoxboLoginServer_GetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boLoginServer_GetStart:=CheckBoxboLoginServer_GetStart.Checked;
end;procedure TfrmMain.EditDBServer_MainFormXChange(Sender: TObject);
beginif EditDBServer_MainFormX.Text = '' then beginEditDBServer_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nDBServer_MainFormX:=EditDBServer_MainFormX.Value;
end;procedure TfrmMain.EditDBServer_MainFormYChange(Sender: TObject);
beginif EditDBServer_MainFormY.Text = '' then beginEditDBServer_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nDBServer_MainFormY:=EditDBServer_MainFormY.Value;
end;procedure TfrmMain.CheckBoxDisableAutoGameClick(Sender: TObject);
beginif not m_boOpen then exit;g_boDBServer_DisableAutoGame:=CheckBoxDisableAutoGame.Checked;
end;procedure TfrmMain.CheckBoxDBServerGetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boDBServer_GetStart:=CheckBoxDBServerGetStart.Checked;
end;procedure TfrmMain.EditLogServer_MainFormXChange(Sender: TObject);
beginif EditLogServer_MainFormX.Text = '' then beginEditLogServer_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nLogServer_MainFormX:=EditLogServer_MainFormX.Value;
end;procedure TfrmMain.EditLogServer_MainFormYChange(Sender: TObject);
beginif EditLogServer_MainFormY.Text = '' then beginEditLogServer_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nLogServer_MainFormY:=EditLogServer_MainFormY.Value;
end;procedure TfrmMain.CheckBoxLogServerGetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boLogServer_GetStart:=CheckBoxLogServerGetStart.Checked;
end;procedure TfrmMain.EditM2Server_MainFormXChange(Sender: TObject);
beginif EditM2Server_MainFormX.Text = '' then beginEditM2Server_MainFormX.Text:='0';end;if not m_boOpen then exit;g_nM2Server_MainFormX:=EditM2Server_MainFormX.Value;
end;procedure TfrmMain.EditM2Server_MainFormYChange(Sender: TObject);
beginif EditM2Server_TestLevel.Text = '' then beginEditM2Server_TestLevel.Text:='0';end;if not m_boOpen then exit;g_nM2Server_TestLevel:=EditM2Server_TestLevel.Value;
end;procedure TfrmMain.EditM2Server_TestLevelChange(Sender: TObject);
beginif EditM2Server_MainFormY.Text = '' then beginEditM2Server_MainFormY.Text:='0';end;if not m_boOpen then exit;g_nM2Server_MainFormY:=EditM2Server_MainFormY.Value;
end;procedure TfrmMain.EditM2Server_TestGoldChange(Sender: TObject);
beginif EditM2Server_TestGold.Text = '' then beginEditM2Server_TestGold.Text:='0';end;if not m_boOpen then exit;g_nM2Server_TestGold:=EditM2Server_TestGold.Value;
end;procedure TfrmMain.CheckBoxM2ServerGetStartClick(Sender: TObject);
beginif not m_boOpen then exit;g_boM2Server_GetStart:=CheckBoxM2ServerGetStart.Checked;
end;procedure TfrmMain.MemoLogChange(Sender: TObject);
beginif MemoLog.Lines.Count > 100 thenMemoLog.Clear;
end;procedure TfrmMain.FormActivate(Sender: TObject);
varname:String;password:string;GetURL      :String;PostURL     :String;GetHtml     :String;sParams     :String;aParams     :TStrings;aStream     :TStringStream;RegEndDateStr :String; //注册到期时间
begin
{if CheckOffline and InternetCheckConnection('http://www.net.cn/', 1, 0) thenbegin
if FrmRegNotice.Reg.Registered then
beginIdHTTP1 := TIdHTTP.Create(nil);aParams := TStringList.Create;aStream := TStringStream.Create('');name:=MacAddress ;//用户网卡地址password:=FrmRegNotice.Reg.RegCode ; //用户注册码GetURL      := 'http://www.LiaoZhaiOL.com/getinfo.asp'; //登录页面网址PostURL     := 'http://www.LiaoZhaiOL.com/getinfo.asp?password='+password; //提交网址sParams     := 'name='+name; //提交参数tryaParams.Clear;aParams.Add(sParams);GetHtml := IdHTTP1.Get(GetURL); // 取登录页面IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';IdHTTP1.Post(PostURL, aParams, aStream);// 提交RegEndDateStr:= aStream.DataString ;  //取得合法用户的授权时间if RegEndDateStr <> '' then  //2009-05-18begin//if DaysBetween(ToDay,StrToDate(RegEndDateStr)) <= 0 thenif Comparedate(StrToDateTime(RegEndDateStr),Now()) <= 0 thenbeginMainOutMessage('授权到期:'+RegEndDateStr); //显示消息FrmRegNotice.Reg.Days := 360;FrmRegNotice.Reg.RegCodeSize := 20;FrmRegNotice.Reg.SetUnregistered;close;end else  MainOutMessage('授权时间:'+RegEndDateStr); //显示消息end  else beginshowmessage('在线激活失败,请联系客服QQ:123563499');close;end;finallyIdHTTP1.Free;aParams.Free;aStream.Free;end;
end;
end ; }
end;procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
beginif m_nStartStatus = 2 then begin//  if Application.MessageBox('游戏服务器正在运行,是否停止游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginButtonStartGameClick(ButtonStartGame);//  end;CanClose:=False;exit;end;CanClose:=True;{//直接关闭无需确认if Application.MessageBox('是否确认关闭《Delphi传奇》网络反外挂数据引擎控制台 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then beginCanClose:=True;end else beginCanClose:=False;end;   }
end;//如果存在多个GameGate网关则调用该函数
procedure TfrmMain.GetMutRunGateConfing(nIndex: Integer);
varIniGameConf:TIniFile;sIniFile:String;sGateAddr:String;nGatePort:Integer;
begincase nIndex of    //0: beginsGateAddr:=g_sRunGate_GateAddr;nGatePort:=g_nRunGate_GatePort;end;1: beginsGateAddr:=g_sRunGate1_GateAddr;nGatePort:=g_nRunGate1_GatePort;end;2: beginsGateAddr:=g_sRunGate2_GateAddr;nGatePort:=g_nRunGate2_GatePort;end;3: beginsGateAddr:=g_sRunGate3_GateAddr;nGatePort:=g_nRunGate3_GatePort;end;4: beginsGateAddr:=g_sRunGate4_GateAddr;nGatePort:=g_nRunGate4_GatePort;end;5: beginsGateAddr:=g_sRunGate5_GateAddr;nGatePort:=g_nRunGate5_GatePort;end;6: beginsGateAddr:=g_sRunGate6_GateAddr;nGatePort:=g_nRunGate6_GatePort;end;7: beginsGateAddr:=g_sRunGate7_GateAddr;nGatePort:=g_nRunGate7_GatePort;end;end;sIniFile:=g_sGameDirectory + g_sRunGate_Directory; //GameGate.iniif not DirectoryExists(sIniFile) then beginCreateDir(sIniFile); //创建路径end;IniGameConf:=TIniFile.Create(sIniFile + g_sRunGate_ConfigFile);  //创建GameGate.iniIniGameConf.WriteString('server','Title',g_sGameName + '(' + IntToStr(nGatePort) + ')');IniGameConf.WriteString('server','GateAddr',sGateAddr);IniGameConf.WriteInteger('server','GatePort',nGatePort);IniGameConf.Free;
end;procedure TfrmMain.Label65Click(Sender: TObject);
beginShellExecute(Application.Handle, nil, Pchar('http://www.delphii.com'), nil,nil, SW_SHOWNOACTIVATE);
end;procedure TfrmMain.EditRunGate_ConntChange(Sender: TObject);
beginif EditRunGate_Connt.Text = '' then beginEditRunGate_Connt.Text:='0';end;if not m_boOpen then exit;g_nRunGate_Count:=EditRunGate_Connt.Value;g_boRunGate1_GetStart:=g_nRunGate_Count >= 2;g_boRunGate2_GetStart:=g_nRunGate_Count >= 3;g_boRunGate3_GetStart:=g_nRunGate_Count >= 4;g_boRunGate4_GetStart:=g_nRunGate_Count >= 5;g_boRunGate5_GetStart:=g_nRunGate_Count >= 6;g_boRunGate6_GetStart:=g_nRunGate_Count >= 7;g_boRunGate7_GetStart:=g_nRunGate_Count >= 8;if g_boRunGate4_GetStart then beging_sDBServer_Config_GateAddr:=g_sAllIPaddr;end else beging_sDBServer_Config_GateAddr:=g_sLocalIPaddr;end;RefGameConsole();
end;procedure TfrmMain.ButtonLoginServerConfigClick(Sender: TObject);
beginfrmLoginServerConfig.Open;
end;procedure TfrmMain.ButtonAdvClick(Sender: TObject);
beginfrmCertServerSet.Open;
end;procedure TfrmMain.CheckBoxDynamicIPModeClick(Sender: TObject);
beginEditGameExtIPaddr.Enabled:=not CheckBoxDynamicIPMode.Checked;
end;
//启动服务器
function TfrmMain.StartService:Boolean;
begin//Result:=False;MainOutMessage('正在启动《Delphi传奇》网络游戏引擎控制台...');g_SessionList:=TStringList.Create;if FileExists(g_sGameFile) then begin//加载StartServer_LGIP.txt(原名称GameList.txt)文件MemoGameList.Lines.LoadFromFile(g_sGameFile);//包含LoginGate的地址end;//下面从StartServer_Config.ini读取g_sNoticeUrl:=g_IniConf.ReadString('Client','NoticeUrl',g_sNoticeUrl);g_nClientForm:=g_IniConf.ReadInteger('Client','ClientForm',g_nClientForm);g_nServerPort:=g_IniConf.ReadInteger('Client','ServerPort',g_nServerPort);g_sServerAddr:=g_IniConf.ReadString('Client','ServerAddr',g_sServerAddr);//g_sServerAddr:=g_IniConf.ReadString('Client','ServerAddr',g_sServerAddr);//g_nServerPort:=g_IniConf.ReadInteger('Client','ServerPort',g_nServerPort);EditNoticeUrl.Text:=g_sNoticeUrl;EditClientForm.Value:=g_nClientForm;tryServerSocket.Address:=g_sServerAddr;ServerSocket.Port:=g_nServerPort;ServerSocket.Active:=false;//True; //开始启动服务器准备接受客户端(登录器)的连接m_dwShowTick:=GetTickCount();Timer.Enabled:=false;//true; //启动定时器 处理 客户端(登录器)的消息excepton e: ESocketError do beginMainOutMessage(format('端口%d打开异常,检查端口是否被其它程序占用!例如:路由器等',[g_nServerPort]));MainOutMessage(E.Message);exit;end;end;MainOutMessage('《Delphi传奇》网络游戏引擎控制台启动完成...');Result:=True;
end;procedure TfrmMain.StopService;
beginTimer.Enabled:=False;g_SessionList.Free;g_IniConf.Free;
end;
//处理客户端封包
procedure TfrmMain.ProcessClientPacket;
varI: Integer;sLineText,sData,sDefMsg:String;nDataLen:Integer;DefMsg:TDefaultMessage;Socket:TCustomWinSocket;
beginfor I := 0 to g_SessionList.Count - 1 do beginSocket:=TCustomWinSocket(g_SessionList.Objects[I]);sLineText:=g_SessionList.Strings[I];if sLineText = '' then Continue;while TagCount(sLineText,'!') > 0 do beginsLineText:=ArrestStringEx(sLineText,'#','!',sData);nDataLen:=length(sData);if (nDataLen >= DEFBLOCKSIZE) then beginsDefMsg:=Copy(sData,1,DEFBLOCKSIZE);DefMsg:=DecodeMessage(sDefMsg);case DefMsg.Ident ofCM_GETGAMELIST: beginSendGameList(Socket);end;end;end;end;g_SessionList.Strings[I]:=sLineText;end;
end;
//向客户端发送SM_SENDGAMELIST LoginGate 游戏登录网关服务器的地址.以便于客户端连接
procedure TfrmMain.SendGameList(Socket: TCustomWinSocket);
varI: Integer;DefMsg:TDefaultMessage;sLineText:String;sNoticeUrl:String;
beginsNoticeUrl:=Trim(EditNoticeUrl.Text);DefMsg:=MakeDefaultMsg(SM_SENDGAMELIST,0,0,0,0);for I := 0 to MemoGameList.Lines.Count - 1 do beginsLineText:=MemoGameList.Lines.Strings[I];if (sLineText <> '') and (sLineText[1] <> ';') then begin //判断是否是注释语句SendSocket(Socket,EncodeMessage(DefMsg) + EncodeString(MemoGameList.Lines.Strings[I]));end;end;DefMsg:=MakeDefaultMsg(SM_SENDGAMELIST,g_nClientForm,1,0,0);SendSocket(Socket,EncodeMessage(DefMsg) + EncodeString(sNoticeUrl));
end;procedure TfrmMain.SendSocket(Socket: TCustomWinSocket; SendMsg: String);
beginSendMsg:='#' + SendMsg + '!';if Socket.Connected thenSocket.SendText(SendMsg);
end;
//连接
procedure TfrmMain.ServerSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);
varI: Integer;boFound:Boolean;
beginboFound:=False;for I := 0 to g_SessionList.Count - 1 do beginif g_SessionList.Objects[I] = Socket then beginboFound:=True;break;end;end;if not boFound then beging_SessionList.AddObject('',Socket)end;
end;
//中止连接
procedure TfrmMain.ServerSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
varI: Integer;
beginfor I := 0 to g_SessionList.Count - 1 do beginif g_SessionList.Objects[I] = Socket then beging_SessionList.Delete(I);break;end;end;
end;
//连接出错
procedure TfrmMain.ServerSocketClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer);
beginErrorCode:=0;Socket.Close;
end;
//接收数据
procedure TfrmMain.ServerSocketClientRead(Sender: TObject;Socket: TCustomWinSocket);
varI: Integer;
beginfor I := 0 to g_SessionList.Count - 1 do beginif g_SessionList.Objects[I] = Socket then beging_SessionList.Strings[I]:=g_SessionList.Strings[I] + Socket.ReceiveText;break;end;end;
end;
//检查客户端连接数 并处理客户端封包
procedure TfrmMain.TimerTimer(Sender: TObject);
beginProcessClientPacket();if GetTickCount - m_dwShowTick > 1000 then beginm_dwShowTick:=GetTickCount();LabelConnect.Caption:=format('端口:%d   当前连接数:%d',[ServerSocket.Port,ServerSocket.Socket.ActiveConnections]);end;
end;procedure TfrmMain.Button2Click(Sender: TObject);
beginMemoGameList.Lines.SaveToFile(g_sGameFile);g_IniConf.WriteString('Client','NoticeUrl',g_sNoticeUrl);g_IniConf.WriteInteger('Client','ClientForm',g_nClientForm);g_IniConf.WriteString('Client','ServerAddr',g_sServerAddr);g_IniConf.WriteInteger('Client','ServerPort',g_nServerPort);Button2.Enabled:=False;
end;procedure TfrmMain.EditNoticeUrlChange(Sender: TObject);
beginif not m_boOpen then exit;g_sNoticeUrl:=Trim(EditNoticeUrl.Text);Button2.Enabled:=True;
end;procedure TfrmMain.EditClientFormChange(Sender: TObject);
beginif not m_boOpen then exit;g_nClientForm:=EditClientForm.Value;Button2.Enabled:=True;
end;procedure TfrmMain.MemoGameListChange(Sender: TObject);
beginif not m_boOpen then exit;Button2.Enabled:=True;
end;procedure TfrmMain.ButtonGeneralDefalultClick(Sender: TObject);
beginEditGameDir.Text:='D:\MMORPGServer\';EditHeroDB.Text:='HeroDB';EditGameName.Text:='Delphi传奇';EditGameExtIPaddr.Text:='127.0.0.1';CheckBoxDynamicIPMode.Checked:=False;
end;procedure TfrmMain.ButtonRunGateDefaultClick(Sender: TObject);
beginEditRunGate_Connt.Value:=3;EditRunGate_GatePort1.Text:='7200';EditRunGate_GatePort2.Text:='7300';EditRunGate_GatePort3.Text:='7400';EditRunGate_GatePort4.Text:='7500';EditRunGate_GatePort5.Text:='7600';EditRunGate_GatePort6.Text:='7700';EditRunGate_GatePort7.Text:='7800';EditRunGate_GatePort8.Text:='7900';
end;procedure TfrmMain.ButtonLoginGateDefaultClick(Sender: TObject);
beginEditLoginGate_MainFormX.Text:='0';EditLoginGate_MainFormY.Text:='0';EditLoginGate_GatePort.Text:='7000';
end;procedure TfrmMain.ButtonSelGateDefaultClick(Sender: TObject);
beginEditSelGate_MainFormX.Text:='0';EditSelGate_MainFormY.Text:='163';EditSelGate_GatePort.Text:='7100';
end;procedure TfrmMain.ButtonLoginSrvDefaultClick(Sender: TObject);
beginEditLoginServer_MainFormX.Text:='251';EditLoginServer_MainFormY.Text:='0';EditLoginServerGatePort.Text:='5500';EditLoginServerServerPort.Text:='5600';CheckBoxboLoginServer_GetStart.Checked:=True;
end;procedure TfrmMain.ButtonDBServerDefaultClick(Sender: TObject);
beginEditDBServer_MainFormX.Text:='0';EditDBServer_MainFormY.Text:='326';CheckBoxDisableAutoGame.Checked:=False;EditDBServerGatePort.Text:='5100';EditDBServerServerPort.Text:='6000';CheckBoxDBServerGetStart.Checked:=True;
end;procedure TfrmMain.ButtonLogServerDefaultClick(Sender: TObject);
beginEditLogServer_MainFormX.Text:='251';EditLogServer_MainFormY.Text:='239';EditLogServerPort.Text:='10000';CheckBoxLogServerGetStart.Checked:=True;
end;procedure TfrmMain.ButtonM2ServerDefaultClick(Sender: TObject);
beginEditM2Server_MainFormX.Text:='560';EditM2Server_MainFormY.Text:='0';EditM2Server_TestLevel.Value:=1;EditM2Server_TestGold.Value:=0;EditM2ServerGatePort.Text:='5000';EditM2ServerMsgSrvPort.Text:='4900';CheckBoxM2ServerGetStart.Checked:=True;
end;procedure TfrmMain.ButtonSearchLoginAccountClick(Sender: TObject);
varsAccount:String;
beginif LoginServer.btStartStatus <> 2 then beginApplication.MessageBox('游戏登录服务器未启动!!!' + #13#13 + '启动游戏登录服务器后才能使用此功能。','提示信息',MB_OK + MB_ICONINFORMATION);exit;end;sAccount:=Trim(EditSearchLoginAccount.Text);if sAccount = '' then beginApplication.MessageBox('帐号不能为空!!!','错误信息',MB_OK + MB_ICONERROR);EditSearchLoginAccount.SetFocus;exit;end;EditLoginAccount.Text:='';EditLoginAccountPasswd.Text:='';EditLoginAccountUserName.Text:='';EditLoginAccountSSNo.Text:='';EditLoginAccountBirthDay.Text:='';EditLoginAccountPhone.Text:='';EditLoginAccountMobilePhone.Text:='';EditLoginAccountQuiz.Text:='';EditLoginAccountAnswer.Text:='';EditLoginAccountQuiz2.Text:='';EditLoginAccountAnswer2.Text:='';EditLoginAccountEMail.Text:='';EditLoginAccountMemo1.Text:='';EditLoginAccountMemo2.Text:='';CkFullEditMode.Checked:=False;UserAccountEditMode(False);EditLoginAccount.Enabled:=False;SendProgramMsg(LoginServer.MainFormHandle,GS_USERACCOUNT,sAccount);
end;procedure TfrmMain.ProcessLoginSrvGetUserAccount(sData: String);
varDBRecord:TAccountDBRecord;DefMsg:TDefaultMessage;sDefMsg:String;
beginif Length(sData) < DEFBLOCKSIZE then exit;sDefMsg:=Copy(sData,1,DEFBLOCKSIZE);sData:=Copy(sData,DEFBLOCKSIZE+1,Length(sData)-DEFBLOCKSIZE);DefMsg:=DecodeMessage(sDefMsg);case DefMsg.Ident of    //SG_USERACCOUNTNOTFOUND: beginApplication.MessageBox('帐号未找到!!!','提示信息',MB_OK + MB_ICONINFORMATION);exit;end;else beginDecodeBuffer(sData,@DBRecord,SizeOf(DBRecord));end;end;EditLoginAccount.Text:=DBRecord.UserEntry.sAccount;EditLoginAccountPasswd.Text:=DBRecord.UserEntry.sPassword;EditLoginAccountUserName.Text:=DBRecord.UserEntry.sUserName;EditLoginAccountSSNo.Text:=DBRecord.UserEntry.sSSNo;EditLoginAccountBirthDay.Text:=DBRecord.UserEntryAdd.sBirthDay;EditLoginAccountPhone.Text:=DBRecord.UserEntry.sPhone;EditLoginAccountMobilePhone.Text:=DBRecord.UserEntryAdd.sMobilePhone;EditLoginAccountQuiz.Text:=DBRecord.UserEntry.sQuiz;EditLoginAccountAnswer.Text:=DBRecord.UserEntry.sAnswer;EditLoginAccountQuiz2.Text:=DBRecord.UserEntryAdd.sQuiz2;EditLoginAccountAnswer2.Text:=DBRecord.UserEntryAdd.sAnswer2;EditLoginAccountEMail.Text:=DBRecord.UserEntry.sEMail;//EditLoginAccountMemo1.Text:=DBRecord.UserEntryAdd.sMemo;//EditLoginAccountMemo2.Text:=DBRecord.UserEntryAdd.sMemo2;ButtonLoginAccountOK.Enabled:=False;
//  ShowMessage(sData);
end;procedure TfrmMain.EditLoginAccountChange(Sender: TObject);
beginButtonLoginAccountOK.Enabled:=True;
end;
procedure TfrmMain.CkFullEditModeClick(Sender: TObject);
beginUserAccountEditMode(CkFullEditMode.Checked);
end;procedure TfrmMain.UserAccountEditMode(boChecked: Boolean);
beginboChecked:=CkFullEditMode.Checked;EditLoginAccountUserName.Enabled:=boChecked;EditLoginAccountSSNo.Enabled:=boChecked;EditLoginAccountBirthDay.Enabled:=boChecked;EditLoginAccountQuiz.Enabled:=boChecked;EditLoginAccountAnswer.Enabled:=boChecked;EditLoginAccountQuiz2.Enabled:=boChecked;EditLoginAccountAnswer2.Enabled:=boChecked;EditLoginAccountMobilePhone.Enabled:=boChecked;EditLoginAccountPhone.Enabled:=boChecked;EditLoginAccountMemo1.Enabled:=boChecked;EditLoginAccountMemo2.Enabled:=boChecked;EditLoginAccountEMail.Enabled:=boChecked;
end;
//创建游戏账号
procedure TfrmMain.ButtonLoginAccountOKClick(Sender: TObject);
varDBRecord:TAccountDBRecord;DefMsg:TDefaultMessage;sDefMsg:String;sAccount,sPassword,sUserName,sSSNo,sPhone,sQuiz,sAnswer,sEMail,sQuiz2,sAnswer2,sBirthDay,sMobilePhone,sMemo,sMemo2:String;
beginsAccount     :=Trim(EditLoginAccount.text);sPassword    :=Trim(EditLoginAccountPasswd.Text);sUserName    :=Trim(EditLoginAccountUserName.Text);sSSNo        :=Trim(EditLoginAccountSSNo.Text);sPhone       :=Trim(EditLoginAccountPhone.Text);sQuiz        :=Trim(EditLoginAccountQuiz.Text);sAnswer      :=Trim(EditLoginAccountAnswer.Text);sEMail       :=Trim(EditLoginAccountEMail.Text);sQuiz2       :=Trim(EditLoginAccountQuiz2.Text);sAnswer2     :=Trim(EditLoginAccountAnswer2.Text);sBirthDay    :=Trim(EditLoginAccountBirthDay.Text);sMobilePhone :=Trim(EditLoginAccountMobilePhone.Text);sMemo        :=Trim(EditLoginAccountMemo1.Text);sMemo2       :=Trim(EditLoginAccountMemo2.Text);if sAccount = '' then beginApplication.MessageBox('帐号不能不空!!!','提示信息',MB_OK + MB_ICONERROR);EditLoginAccount.SetFocus;exit;end;if sPassword = '' then beginApplication.MessageBox('密码不能不空!!!','提示信息',MB_OK + MB_ICONERROR);EditLoginAccountPasswd.SetFocus;exit;end;FillChar(DBRecord,SizeOf(DBRecord),0);DBRecord.UserEntry.sAccount:=sAccount;DBRecord.UserEntry.sPassword:=sPassword;DBRecord.UserEntry.sUserName:=sUserName;DBRecord.UserEntry.sSSNo:=sSSNo;DBRecord.UserEntry.sPhone:=sPhone;DBRecord.UserEntry.sQuiz:=sQuiz;DBRecord.UserEntry.sAnswer:=sAnswer;DBRecord.UserEntry.sEMail:=sEMail;DBRecord.UserEntryAdd.sQuiz2:=sQuiz2;DBRecord.UserEntryAdd.sAnswer2:=sAnswer2;DBRecord.UserEntryAdd.sBirthDay:=sBirthDay;DBRecord.UserEntryAdd.sMobilePhone:=sMobilePhone;//DBRecord.UserEntryAdd.sMemo:=sMemo;//DBRecord.UserEntryAdd.sMemo2:=sMemo2;DefMsg:=MakeDefaultMsg(0,0,0,0,0);SendProgramMsg(LoginServer.MainFormHandle,GS_CHANGEACCOUNTINFO,EncodeMessage(DefMsg) +  EncodeBuffer(@DBRecord,SizeOf(DBRecord)));ButtonLoginAccountOK.Enabled:=False;
end;
procedure TfrmMain.ProcessLoginSrvChangeUserAccountStatus(sData: String);
varDefMsg:TDefaultMessage;sDefMsg:String;
beginif Length(sData) < DEFBLOCKSIZE then exit;sDefMsg:=Copy(sData,1,DEFBLOCKSIZE);sData:=Copy(sData,DEFBLOCKSIZE+1,Length(sData)-DEFBLOCKSIZE);DefMsg:=DecodeMessage(sDefMsg);case DefMsg.Recog of    //-1: Application.MessageBox('指定的帐号不存在!!!','提示信息',MB_OK + MB_ICONERROR);1:  Application.MessageBox('帐号更新成功...','提示信息',MB_OK + MB_ICONINFORMATION);2:  Application.MessageBox('帐号更新失败!!!','提示信息',MB_OK + MB_ICONINFORMATION);end;    // case
end;procedure TfrmMain.RefGameDebug;
varCheckCode:TCheckCode;dwReturn:LongWord;
beginEditM2CheckCodeAddr.Text:=IntToHex(g_dwM2CheckCodeAddr,2);FillChar(CheckCode,SizeOf(CheckCode),0);ReadProcessMemory(M2Server.ProcessHandle,Pointer(g_dwM2CheckCodeAddr),@CheckCode,SizeOf(CheckCode),dwReturn);if dwReturn = SizeOf(CheckCode) then beginEditM2CheckCode.Text:=IntToStr(CheckCode.dwThread0);EditM2CheckStr.Text:=String(CheckCode.sThread0);end;EditDBCheckCodeAddr.Text:=IntToHex(g_dwDBCheckCodeAddr,2);FillChar(CheckCode,SizeOf(CheckCode),0);ReadProcessMemory(DBServer.ProcessHandle,Pointer(g_dwDBCheckCodeAddr),@CheckCode,SizeOf(CheckCode),dwReturn);if dwReturn = SizeOf(CheckCode) then beginEditDBCheckCode.Text:=IntToStr(CheckCode.dwThread0);EditDBCheckStr.Text:=String(CheckCode.sThread0);end;
end;procedure TfrmMain.TimerCheckDebugTimer(Sender: TObject);
beginRefGameDebug();
end;procedure TfrmMain.ButtonM2SuspendClick(Sender: TObject);
beginSuspendThread(M2Server.ProcessInfo.hThread);
end;end.

《Delphi传奇》研究系列文章1:服务端控制中心(服务器网关启动器)相关推荐

  1. 传奇3单机显示服务器进不去,传奇3网游单机一键端,玩游人生传奇42魔法1.45服务端带工具...

    游戏名称:网络游戏-传奇3 单机配置推荐:Windows XP/7/Vista (32 或 64位) CPU:双核2GHz 内存:2GB(至少) 硬盘:6GB可用空间 显卡:支持9.0C的512MB显 ...

  2. c语言传奇引擎源码,Ei3.0服务端引擎源代码+登陆网关+客户端插件

    Ei3.0服务端引擎源代码+登陆网关+客户端插件 procedure TPANEL.Button3Click(Sender: TObject); var P:integer; mItem:DWORD; ...

  3. Netty系列之Netty 服务端创建

    背景 1.1. 原生NIO类库的复杂性 在开始本文之前,我先讲一件自己亲身经历的事:大约在2011年的时候,周边的两个业务团队同时进行新版本开发,他们都需要基于NIO非阻塞特性构建高性能.异步和高可靠 ...

  4. Vue2系列教程——SSR服务端渲染

    Vue2 SSR服务端渲染 概念:ssr(server side render)服务端渲染 优点: 有利于搜索引擎的SEO操作,由于搜索引擎爬取的是完全渲染出来的页面. 对于网络慢或运行慢的设备,可提 ...

  5. 《微服务系列:Eureka服务注册发现中心》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  6. 服务端架构中的“网关服务器”

    这么一个场景:一个要承载高并发.具有高性能的后台服务,往往会有多个不同的应用服务.问题来了,你会怎样设计架构呢? 如下图所示,为了共用一个稳定高效的网络处理功能,把所有服务写在一个进程里. 接下来悲剧 ...

  7. 艺赛旗(RPA)【服务端】修改服务器访问端口

    艺赛旗 RPA8.0全新首发免费下载 点击下载 http://www.i-search.com.cn/index.html?from=line1 详细内容请参看艺赛旗官网支持栏目:RPA社区 点击链接 ...

  8. SOA系列文章(二):服务设计原理:服务模式和反模式

    服务设计系列的法则已经发展到最佳通信实践和取样相关编码的程度.本文提供了设计和实现网络服务的基本原理,并且对面向服务的体系结构(SOA)的相关概念做了一个简要的回顾,以及有关于几种模式和反模式的详细讨 ...

  9. 天龙八部TLBB系列 - 网单服务端各目录文件说明【超详细】

    往期文章分享 点击跳转=><导航贴>- Unity手册,系统实战学习 点击跳转=><导航贴>- Android手册,重温移动开发 本文约14千字,新手阅读需要18分 ...

最新文章

  1. 阿里亲制明信片,字节、百度直接发锅……这些公司的新年礼盒越来越会玩~
  2. ssm(Spring+Spring mvc+mybatis)——web.xml
  3. 幻灯片演示什么模式最好_清洁单元测试图案–演示幻灯片
  4. 理解Caffe的网络模型
  5. Prism4文档翻译(第九章 第二部分)
  6. 【Qt教程】2.4 - Qt5 控件 - QListWidget列表框
  7. 并发设计模式之Master-Worker模式
  8. 大数据爆炸改变企业的决策
  9. php 调用vs2013 dll文件,vs2015 肿么添加dll文件
  10. 不小心合并了icloud通讯录_苹果手机号码被删除如何恢复?找回通讯录的具体步骤...
  11. 九江职业学院计算机专业怎么样,请问九江职业大学和九江职业技术学院,相比之下哪个好一点?...
  12. 用旧电脑安装黑群晖系统
  13. serv-u and hway3.0
  14. 3D模型欣赏:《皇冠女孩》次时代 玄幻 美女
  15. 【Mysql】Error 1826: Duplicate foreign key constraint 错误
  16. Oracle数据库大作业
  17. 前端与移动开发----微信小程序----小程序(四)
  18. html上标下标标签 示例_带有示例HTML th表标题标签教程
  19. potplayer播放完毕后自动删除播放记录,不保留近期播放记录
  20. 农作物病虫害AI智能监测预警系统

热门文章

  1. QGIS从零开始进阶 第一章 QGIS简介与安装
  2. django 压缩文件下载
  3. ODBC 连接数据库 SQL server 2008
  4. Java 第九次平时作业
  5. C#设置textbox文本框只能输入0或1
  6. 好工具推荐系列:Linux远程连接,终端工具,SSH和SFTP
  7. MES系统质量管理怎么做?
  8. C语言 埃氏筛法求素数
  9. 【开源】知乎视频播放器 Griffith 介绍
  10. Stream通过List里对象中某个属性最小来取该最小对象