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

提示:所有的研究心得直接写在源码注释中,对照源码看注释即可学习了解传奇的流程架构。《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}
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls,INIFiles, ExtCtrls,Spin, JSocket,WinInet,ComObj,
  shellapi,IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP,DateUtils;

type
  TfrmMain = 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);
  private
    m_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 }
  public
    procedure ProcessMessage(var Msg: TMsg; var Handled: Boolean);
    procedure MyMessage(var MsgData:TWmCopyData);message WM_COPYDATA;

    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses GShare, HUtil32, Grobal2, GLoginServer, GCertServerSet, EDcode, Share,SDK;

{$R *.dfm}
{输出调试字符串}
procedure DebugOutStr (msg: string);
var
   flname: string;
   fhandle: TextFile;
begin
   //exit;
   flname := '.\!StartServer_debug.txt';
   if FileExists(flname) then begin
      AssignFile (fhandle, flname);
      Append (fhandle);
   end else begin
      AssignFile (fhandle, flname);
      Rewrite (fhandle);
   end;
   WriteLn (fhandle, TimeToStr(Time) + ' ' + msg);
   CloseFile (fhandle);
end;
//显示消息
procedure TfrmMain.MainOutMessage(sMsg: string);
begin
  sMsg:='[' + DateTimeToStr(Now) + '] ' + sMsg;
  MemoLog.Lines.Add(sMsg);
end;

procedure TfrmMain.ButtonNext1Click(Sender: TObject);
var
  sGameDirectory:String;
  sHeroDBName:String;
  sM2Server_Reg,sRunGate_Reg,sDBServer_Reg:String;
  sGameName:String;
  sExtIPAddr:String;  
begin
  sGameDirectory:=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 begin
    Application.MessageBox('游戏服务器名称输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);
    EditGameName.SetFocus;
    exit;
  end;
  if (sExtIPAddr = '') or not IsIPaddr(sExtIPAddr) then begin
    Application.MessageBox('游戏服务器外部IP地址输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);
    EditGameExtIPaddr.SetFocus;
    exit;
  end;

  if (sGameDirectory = '') or not DirectoryExists(sGameDirectory) then begin
    Application.MessageBox('游戏目录输入不正确!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);
    EditGameDir.SetFocus;
    exit;
  end;
  if not (sGameDirectory[length(sGameDirectory)] = '\') then begin
    Application.MessageBox('游戏目录名称最后一个字符必须为"\"!!!','提示信息',MB_OK + MB_ICONEXCLAMATION);
    EditGameDir.SetFocus;
    exit;
  end;
  if sHeroDBName = '' then begin
    Application.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);
begin
  PageControl3.ActivePageIndex:=0;
end;

procedure TfrmMain.ButtonNext2Click(Sender: TObject);
var
  nPort:Integer;
begin
  nPort:=Str_ToInt(Trim(EditLoginGate_GatePort.Text),-1);
  if (nPort < 0) or (nPort > 65535) then begin
    Application.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditLoginGate_GatePort.SetFocus;
    exit;
  end;
  g_nLoginGate_GatePort:=nPort;
  PageControl3.ActivePageIndex:=2;
end;

procedure TfrmMain.ButtonPrv3Click(Sender: TObject);
begin
  PageControl3.ActivePageIndex:=1;
end;
procedure TfrmMain.ButtonNext3Click(Sender: TObject);
var
  nPort:Integer;
begin
  nPort:=Str_ToInt(Trim(EditSelGate_GatePort.Text),-1);
  if (nPort < 0) or (nPort > 65535) then begin
    Application.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 begin
    Application.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditSelGate_GatePort1.SetFocus;
    exit;
  end;
  g_nSeLGate_GatePort1:=nPort;
  PageControl3.ActivePageIndex:=3;
end;

procedure TfrmMain.ButtonNext4Click(Sender: TObject);
var
  nPort1,nPort2,nPort3,nPort4,nPort5,nPort6,nPort7,nPort8:Integer;
begin
  nPort1:=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 begin
    Application.MessageBox('网关一端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort1.SetFocus;
    exit;
  end;
  if (nPort2 < 0) or (nPort2 > 65535) then begin
    Application.MessageBox('网关二端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort2.SetFocus;
    exit;
  end;
  if (nPort3 < 0) or (nPort3 > 65535) then begin
    Application.MessageBox('网关三端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort3.SetFocus;
    exit;
  end;
  if (nPort4 < 0) or (nPort4 > 65535) then begin
    Application.MessageBox('网关四端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort4.SetFocus;
    exit;
  end;
  if (nPort5 < 0) or (nPort5 > 65535) then begin
    Application.MessageBox('网关五端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort5.SetFocus;
    exit;
  end;
  if (nPort6 < 0) or (nPort6 > 65535) then begin
    Application.MessageBox('网关六端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort6.SetFocus;
    exit;
  end;
  if (nPort7 < 0) or (nPort7 > 65535) then begin
    Application.MessageBox('网关七端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditRunGate_GatePort7.SetFocus;
    exit;
  end;
  if (nPort8 < 0) or (nPort8 > 65535) then begin
    Application.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);
var
  nGatePort,nServerPort:Integer;
begin
  nGatePort:=Str_ToInt(Trim(EditLoginServerGatePort.Text),-1);
  nServerPort:=Str_ToInt(Trim(EditLoginServerServerPort.Text),-1);

  if (nGatePort < 0) or (nGatePort > 65535) then begin
    Application.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditLoginServerGatePort.SetFocus;
    exit;
  end;
  if (nServerPort < 0) or (nServerPort > 65535) then begin
    Application.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);
var
  nGatePort,nServerPort:Integer;
begin
  nGatePort:=Str_ToInt(Trim(EditDBServerGatePort.Text),-1);
  nServerPort:=Str_ToInt(Trim(EditDBServerServerPort.Text),-1);

  if (nGatePort < 0) or (nGatePort > 65535) then begin
    Application.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditDBServerGatePort.SetFocus;
    exit;
  end;
  if (nServerPort < 0) or (nServerPort > 65535) then begin
    Application.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);
var
  nPort:Integer;
begin
  nPort:=Str_ToInt(Trim(EditLogServerPort.Text),-1);
  if (nPort < 0) or (nPort > 65535) then begin
    Application.MessageBox('端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditLogServerPort.SetFocus;
    exit;
  end;
  g_nLogServer_Port:=nPort;
  PageControl3.ActivePageIndex:=7;
end;
procedure TfrmMain.ButtonNext8Click(Sender: TObject);
var
  nGatePort,nMsgSrvPort:Integer;
begin
  nGatePort:=Str_ToInt(Trim(EditM2ServerGatePort.Text),-1);
  nMsgSrvPort:=Str_ToInt(Trim(EditM2ServerMsgSrvPort.Text),-1);
  if (nGatePort < 0) or (nGatePort > 65535) then begin
    Application.MessageBox('网关端口设置错误!!!','错误信息',MB_OK + MB_ICONERROR);
    EditM2ServerGatePort.SetFocus;
    exit;
  end;
  if (nMsgSrvPort < 0) or (nMsgSrvPort > 65535) then begin
    Application.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);
begin
  PageControl3.ActivePageIndex:=2;
end;

procedure TfrmMain.ButtonPrv5Click(Sender: TObject);
begin
  PageControl3.ActivePageIndex:=3;
end;

procedure TfrmMain.ButtonPrv6Click(Sender: TObject);
begin
  PageControl3.ActivePageIndex:=4;
end;

procedure TfrmMain.ButtonPrv7Click(Sender: TObject);
begin
  PageControl3.ActivePageIndex:=5;
end;

procedure TfrmMain.ButtonPrv8Click(Sender: TObject);
begin
  PageControl3.ActivePageIndex:=6;
end;


procedure TfrmMain.ButtonPrv9Click(Sender: TObject);
begin
  PageControl3.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 begin
    ButtonGenGameConfigClick(ButtonGenGameConfig);
  end;
  PageControl3.ActivePageIndex:=0;
  PageControl1.ActivePageIndex:=0;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  flname:string;
  F: Textfile;
begin
  flname := '.\!StartServer_debug.txt';
  if FileExists(flname) then
  begin
    AssignFile(F,flname );
    try
      Reset(F);
      CloseFile(F);
      Erase(F);
    except
      on EInOutError do
        MessageDlg('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 begin
    TabSheetDebug.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);
begin
  LicenseIDBox.Text:=MacAddress;

end;

procedure TfrmMain.ButtonGenGameConfigClick(Sender: TObject);
begin
//  ButtonGenGameConfig.Enabled:=False;
  GenGameConfig();
  RefGameConsole();
  Application.MessageBox('引擎配置文件已经生成完毕...','提示信息',MB_OK + MB_ICONINFORMATION);
end;
procedure TfrmMain.GenGameConfig;
begin
  GenDBServerConfig();
  GenLoginServerConfig();
  GenLogServerConfig();
  GenM2ServerConfig();
  GenLoginGateConfig();
  GenSelGateConfig();
  GenRunGateConfig();
end;
//生成DBSver配置文件,放在.\DBServer目录
procedure TfrmMain.GenDBServerConfig;
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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);  //登录服务器IP
  IniGameConf.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 then
    case 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 begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_IdDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_HumDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_FeeDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_BackupDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_ConnectDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_Config_LogDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
end;
//生成LoginServer配置文件    LS_Config.ini
procedure TfrmMain.GenLoginServerConfig;
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sLoginServer_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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 begin
    SaveList.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 begin
    SaveList.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 begin
    CreateDir(sIniFile);
  end;

  sIniFile:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_CountLogDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;

  sIniFile:=g_sGameDirectory + g_sLoginServer_Directory + g_sLoginServer_WebLogDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
end;
// 生成LogData.ini配置文件
procedure TfrmMain.GenLogServerConfig;
var
  IniGameConf:TIniFile;
  sIniFile:String;
begin
  sIniFile:=g_sGameDirectory + g_sLogServer_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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 begin
    CreateDir(sIniFile);
  end;  
  IniGameConf.Free;
end;
//生成!Setup.txt配置文件
procedure TfrmMain.GenM2ServerConfig;
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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 begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_GuildDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_VentureDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_ConLogDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_LogDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_CastleDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_EnvirDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_MapDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  sIniFile:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_NoticeDir;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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;
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sLoginGate_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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();
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sSelGate_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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);
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
  sGateAddr:String;
  nGatePort:Integer;
  sServerAddr:String;
begin
  sIniFile:=g_sGameDirectory + g_sSelGate_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile);
  end;
  case nIndex of    //
    0: begin
      sGateAddr:=g_sSelGate_GateAddr;
      nGatePort:=g_nSelGate_GatePort;
      sServerAddr:=g_sLocalIPaddr;
    end;
    1: begin
      sGateAddr:=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;
var
  IniGameConf:TIniFile;
  sIniFile:String;
  SaveList:TStringList;
begin
  sIniFile:=g_sGameDirectory + g_sRunGate_Directory;
  if not DirectoryExists(sIniFile) then begin
    CreateDir(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;
begin
  m_boOpen:=False;
  EditM2ServerProgram.Text:=g_sGameDirectory + g_sM2Server_Directory + g_sM2Server_ProgramFile; //OK
  EditDBServerProgram.Text:=g_sGameDirectory + g_sDBServer_Directory + g_sDBServer_ProgramFile; //OK
  EditDBServerGatePort.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);
begin
  g_boDBServer_GetStart:=CheckBoxDBServer.Checked;
end;

procedure TfrmMain.CheckBoxLoginServerClick(Sender: TObject);
begin
  g_boLoginServer_GetStart:=CheckBoxLoginServer.Checked;
end;

procedure TfrmMain.CheckBoxM2ServerClick(Sender: TObject);
begin
  g_boM2Server_GetStart:=CheckBoxM2Server.Checked;
end;

procedure TfrmMain.CheckBoxLogServerClick(Sender: TObject);
begin
  g_boLogServer_GetStart:=CheckBoxLogServer.Checked;
end;

procedure TfrmMain.CheckBoxLoginGateClick(Sender: TObject);
begin
  g_boLoginGate_GetStart:=CheckBoxLoginGate.Checked;
end;

procedure TfrmMain.CheckBoxSelGateClick(Sender: TObject);
begin
  g_boSelGate_GetStart:=CheckBoxSelGate.Checked;
end;

function TfrmMain.CheckOffline: boolean;
var

  ConnectState: DWORD;

  StateSize: DWORD;

begin

  ConnectState:= 0;

  StateSize:= SizeOf(ConnectState);

  result:= false;

  if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then

  if (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true;

end;

function TfrmMain.GetIP: string;
var
   xml : OleVariant;
   r:string;
   p1,p2 : Integer;
begin
   xml := 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);
begin
  g_boRunGate_GetStart:=CheckBoxRunGate.Checked;
end;

procedure TfrmMain.CheckBoxRunGate1Click(Sender: TObject);
begin
  g_boRunGate1_GetStart:=CheckBoxRunGate1.Checked;
end;

procedure TfrmMain.CheckBoxRunGate2Click(Sender: TObject);
begin
  g_boRunGate2_GetStart:=CheckBoxRunGate2.Checked;
end;
//启动
procedure TfrmMain.ButtonStartGameClick(Sender: TObject);
var
  Conf:TIniFile;
  sConfigFileName,IPAddr:String;
  Conf1:TIniFile;
  sConfigFileName1:String;
begin
//////////////////////////////
  if m_nStartStatus = 0 then
  begin
  //首先尝试获取公网IP地址
    if not CheckBox1.Checked then
    begin
      ShellExecute(Application.Handle, nil, Pchar('http://www.net.cn/static/customercare/yourIP.asp'), nil,
                     nil, SW_SHOWNOACTIVATE);
      try
        frmMain.Cursor:=crHourGlass;
        if CheckOffline and InternetCheckConnection('http://www.net.cn/', 1, 0) then
        begin
          LabeledEdit1.text:= GetIP  ;
          sConfigFileName1:='D:\MMORPGServer\公网IP地址.ini';
          Conf1        := TIniFile.Create(sConfigFileName1);
          Conf1.WriteString('IPAddr','ServerIPAddr',LabeledEdit1.text);
          Conf1.Free;
        end
        else
          showmessage('无法获取IP地址,请确定您能够正常上网,并检查代理和防火墙设置!'+#13+'确认设置正确后,关闭并且重新启动引擎!');
          frmMain.Cursor:=crDefault;
      except
        showmessage('无法获取IP地址,请确定您能够正常上网,并检查代理和防火墙设置!'+#13+'确认设置正确后,关闭并且重新启动引擎!');
        LabeledEdit1.Text :='127.0.0.1';
      end;

    end else LabeledEdit1.Text :='127.0.0.1';

    if LabeledEdit1.Text <> '' then
    begin
      g_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 <> '' then
    begin
      g_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 of
    0: begin //创建时的初始化数值,第一次启动
      // DebugOutStr('ButtonStartGameClick 0: begin');
    //  if Application.MessageBox('是否确认启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin

        StartGame();
     // end;
    end;
    1: begin
     // if Application.MessageBox('是否确认中止启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin
        TimerStartGame.Enabled:=False;
        m_nStartStatus:=2;
        ButtonStartGame.Caption:=g_sButtonStopGame;
     // end;
    end;
    2: begin
     // if Application.MessageBox('是否确认停止游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin
        StopGame();
    //  end;
    end;
    3: begin
      //if Application.MessageBox('是否确认中止启动游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin
        TimerStopGame.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;
var
  nRetCode: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 Gate
  FillChar(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;
begin
  ButtonStartGame.Caption:=g_sButtonStopStopGame;
  MainOutMessage('正在开始关闭服务器程序...');
  TimerCheckRun.Enabled:=False;
  TimerStopGame.Enabled:=True;
  m_nStartStatus:=3;
  ServerSocket.Active:=False; 
end;
//改变启动服务器程序顺序可能导致有的服务器程序不能启动
procedure TfrmMain.TimerStartGameTimer(Sender: TObject);   //原来200
var
  nRetCode:Integer;
begin
  {  if LogServer.boGetStart then begin
    case LogServer.btStartStatus of    //
      0: begin
        nRetCode:=RunProgram(LogServer,IntToStr(Self.Handle),0);
        if nRetCode = 0 then begin
          LogServer.btStartStatus:=1;
          LogServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LogServer.ProcessInfo.dwProcessId);
        end else begin
          LogServer.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
//        LogServer.btStartStatus:=2;
        exit;
      end;
    end;
  end;  }
  if LoginServer.boGetStart then begin
    case LoginServer.btStartStatus of    //
      0: begin
        nRetCode:=RunProgram(LoginServer,IntToStr(Self.Handle),0);
        if nRetCode = 0 then begin
          LoginServer.btStartStatus:=1;
          LoginServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginServer.ProcessInfo.dwProcessId);
        end else begin
          LoginServer.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 begin
          LoginGate.btStartStatus:=1;
          LoginGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginGate.ProcessInfo.dwProcessId);
        end else begin
          LoginGate.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
//        LoginGate.btStartStatus:=2;
        exit;
      end;
    end;
  end;

  if DBServer.boGetStart then begin
    case DBServer.btStartStatus of    //
      0: begin
        nRetCode:=RunProgram(DBServer,IntToStr(Self.Handle),0);
        if nRetCode = 0 then begin
          DBServer.btStartStatus:=1;
          DBServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,DBServer.ProcessInfo.dwProcessId);
        end else begin
          ShowMessage(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 begin
          M2Server.btStartStatus:=1;
          M2Server.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,M2Server.ProcessInfo.dwProcessId);
        end else begin
          M2Server.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
//        M2Server.btStartStatus:=2;
        exit;
      end;
    end;
  end;

  //GameGate网关
  if RunGate.boGetStart then begin
    case RunGate.btStartStatus of    //
      0: begin
       // GetMutRunGateConfing(0);//如果存在多个GameGate网关则调用该函数                              
        nRetCode:=RunProgram(RunGate,IntToStr(Self.Handle),2000); //为什么2000?
        if nRetCode = 0 then begin
          RunGate.btStartStatus:=1;
         //DebugOutStr( IntToStr(RunGate.nMainFormX)+'///'+IntToStr(RunGate.nMainFormy) );
          RunGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate.ProcessInfo.dwProcessId);
        end else begin
          RunGate.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate.btStartStatus:=2;
       // exit;
      end;
    end;
  end;

  {if RunGate1.boGetStart then begin
    case RunGate1.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(1);
        nRetCode:=RunProgram(RunGate1,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate1.btStartStatus:=1;
          RunGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate1.ProcessInfo.dwProcessId);
        end else begin
          RunGate1.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate1.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate2.boGetStart then begin
    case RunGate2.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(2);
        nRetCode:=RunProgram(RunGate2,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate2.btStartStatus:=1;
          RunGate2.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate2.ProcessInfo.dwProcessId);
        end else begin
          RunGate2.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate2.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate3.boGetStart then begin
    case RunGate3.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(3);
        nRetCode:=RunProgram(RunGate3,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate3.btStartStatus:=1;
          RunGate3.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate3.ProcessInfo.dwProcessId);
        end else begin
          RunGate3.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate3.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate4.boGetStart then begin
    case RunGate4.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(4);
        nRetCode:=RunProgram(RunGate4,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate4.btStartStatus:=1;
          RunGate4.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate4.ProcessInfo.dwProcessId);
        end else begin
          RunGate4.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate4.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate5.boGetStart then begin
    case RunGate5.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(5);
        nRetCode:=RunProgram(RunGate5,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate5.btStartStatus:=1;
          RunGate5.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate5.ProcessInfo.dwProcessId);
        end else begin
          RunGate5.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate5.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate6.boGetStart then begin
    case RunGate6.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(6);
        nRetCode:=RunProgram(RunGate6,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate6.btStartStatus:=1;
          RunGate6.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate6.ProcessInfo.dwProcessId);
        end else begin
          RunGate6.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate6.btStartStatus:=2;
//        exit;
      end;
    end;
  end;

  if RunGate7.boGetStart then begin
    case RunGate7.btStartStatus of    //
      0: begin
        GetMutRunGateConfing(7);
        nRetCode:=RunProgram(RunGate7,IntToStr(Self.Handle),2000);
        if nRetCode = 0 then begin
          RunGate7.btStartStatus:=1;
          RunGate7.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate7.ProcessInfo.dwProcessId);
        end else begin
          RunGate7.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
        RunGate7.btStartStatus:=2;
//        exit;
      end;
    end;
  end;  }


  if SelGate.boGetStart then begin
    case SelGate.btStartStatus of    //
      0: begin
        //DebugOutStr('case SelGate.btStartStatus of');
        GenMutSelGateConfig(0);
        nRetCode:=RunProgram(SelGate,IntToStr(Self.Handle),0);
        if nRetCode = 0 then begin
          SelGate.btStartStatus:=1;
          SelGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate.ProcessInfo.dwProcessId);
        end else begin
          SelGate.btStartStatus:=9;
          ShowMessage(IntToStr(nRetCode));
        end;
        exit;
      end;
      1: begin  //如果状态为1 则还没启动完成
//        SelGate.btStartStatus:=2;
        exit;
      end;
    end;
  end;

  {if SelGate1.boGetStart then begin
    case SelGate1.btStartStatus of    //
      0: begin
        GenMutSelGateConfig(1);
        nRetCode:=RunProgram(SelGate1,IntToStr(Self.Handle),0);
        if nRetCode = 0 then begin
          SelGate1.btStartStatus:=1;
          SelGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate1.ProcessInfo.dwProcessId);
        end else begin
          SelGate1.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 begin
          LoginGate.btStartStatus:=1;
          LoginGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginGate.ProcessInfo.dwProcessId);
        end else begin
          LoginGate.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);
var
  dwExitCode:LongWord;
  nRetCode:Integer;
begin
  if LoginGate.boGetStart and (LoginGate.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(LoginGate.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if LoginGate.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(LoginGate,0);
          MainOutMessage('正常关闭超时,登录网关已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(LoginGate.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      LoginGate.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(LoginGate.ProcessHandle);
      LoginGate.btStartStatus:=0;
      MainOutMessage('登录网关已关闭...');
    end;
  end;

  if SelGate.boGetStart and (SelGate.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(SelGate.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if SelGate.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(SelGate,0);
          MainOutMessage('正常关闭超时,角色网关已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(SelGate.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      SelGate.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(SelGate.ProcessHandle);
      SelGate.btStartStatus:=0;
      MainOutMessage('角色网关已关闭...');
    end;
  end;

  if RunGate.boGetStart and (RunGate.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate.ProcessHandle);
        RunGate.btStartStatus:=0;
        MainOutMessage('游戏网关一已关闭...');
      end;
    end;
  end;

 { if RunGate1.boGetStart and (RunGate1.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate1.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate1,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate1.ProcessHandle);
        RunGate1.btStartStatus:=0;
        MainOutMessage('游戏网关二已停止...');
      end;
    end;
  end;

  if RunGate2.boGetStart and (RunGate2.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate2.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate2,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate2.ProcessHandle);
        RunGate2.btStartStatus:=0;
        MainOutMessage('游戏网关三已停止...');
      end;
    end;
  end;
  if RunGate3.boGetStart and (RunGate3.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate3.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate3,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate3.ProcessHandle);
        RunGate3.btStartStatus:=0;
        MainOutMessage('游戏网关四已停止...');
      end;
    end;
  end;

  if RunGate4.boGetStart and (RunGate4.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate4.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate4,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate4.ProcessHandle);
        RunGate4.btStartStatus:=0;
        MainOutMessage('游戏网关五已停止...');
      end;
    end;
  end;

  if RunGate5.boGetStart and (RunGate5.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate5.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate5,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate5.ProcessHandle);
        RunGate5.btStartStatus:=0;
        MainOutMessage('游戏网关六已停止...');
      end;
    end;
  end;

  if RunGate6.boGetStart and (RunGate6.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate6.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate6,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate6.ProcessHandle);
        RunGate6.btStartStatus:=0;
        MainOutMessage('游戏网关七已停止...');
      end;
    end;
  end;

  if RunGate7.boGetStart and (RunGate7.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(RunGate7.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      nRetCode:=StopProgram(RunGate7,2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate7.ProcessHandle);
        RunGate7.btStartStatus:=0;
        MainOutMessage('游戏网关八已停止...');
      end;
    end;
  end;   }

  if M2Server.boGetStart and (M2Server.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(M2Server.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if M2Server.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(M2Server,1000);
          MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(M2Server.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      M2Server.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(M2Server.ProcessHandle);
      M2Server.btStartStatus:=0;
      MainOutMessage('游戏引擎主系统程序已关闭...');
    end;
  end;

  if LoginServer.boGetStart and (LoginServer.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(LoginServer.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if LoginServer.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(LoginServer,1000);
          MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(LoginServer.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      LoginServer.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(LoginServer.ProcessHandle);
      LoginServer.btStartStatus:=0;
      MainOutMessage('登录服务器已关闭...');
    end;
  end;

  if LogServer.boGetStart and (LogServer.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(LogServer.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if LogServer.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(LogServer,0);
          MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(LogServer.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      LogServer.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(LogServer.ProcessHandle);
      LogServer.btStartStatus:=0;
      MainOutMessage('游戏日志服务器已关闭...');
    end;
  end;

  if DBServer.boGetStart and (DBServer.btStartStatus in [2,3]) then begin
    GetExitCodeProcess(DBServer.ProcessHandle,dwExitCode);
    if dwExitCode = STILL_ACTIVE then begin
      if DBServer.btStartStatus = 3 then begin
        if GetTickCount - g_dwStopTick > g_dwStopTimeOut then begin
          StopProgram(DBServer,0);
          MainOutMessage('正常关闭超时,游戏引擎主程序已被强行停止...');
        end;
        exit; //如果正在关闭则等待,不处理下面
      end;
      SendProgramMsg(DBServer.MainFormHandle,GS_QUIT,'');
      g_dwStopTick:=GetTickCount();
      DBServer.btStartStatus := 3;
      exit;
    end else begin
      CloseHandle(DBServer.ProcessHandle);
      DBServer.btStartStatus:=0;
      MainOutMessage('游戏数据库服务器已关闭...');
    end;
  end;








  TimerStopGame.Enabled:=False;
  ButtonStartGame.Caption:=g_sButtonStartGame;
  m_nStartStatus:=0;
end;

procedure TfrmMain.TimerCheckRunTimer(Sender: TObject);
var
  dwExitCode:LongWord;
  nRetCode:Integer;
begin
  if DBServer.boGetStart then begin
    GetExitCodeProcess(DBServer.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(DBServer,IntToStr(Self.Handle),0);

      if nRetCode = 0 then begin
        CloseHandle(DBServer.ProcessHandle);
        DBServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,DBServer.ProcessInfo.dwProcessId);
        MainOutMessage('数据库异常关闭,已被重新启动...');
      end;
    end;
  end;

  if LoginServer.boGetStart then begin
    GetExitCodeProcess(LoginServer.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(LoginServer,IntToStr(Self.Handle),0);
      if nRetCode = 0 then begin
        CloseHandle(LoginServer.ProcessHandle);
        LoginServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LoginServer.ProcessInfo.dwProcessId);
        MainOutMessage('登录服务器异常关闭,已被重新启动...');
      end;
    end;
  end;

  if LogServer.boGetStart then begin
    GetExitCodeProcess(LogServer.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(LogServer,IntToStr(Self.Handle),0);
      if nRetCode = 0 then begin
        CloseHandle(LogServer.ProcessHandle);
        LogServer.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,LogServer.ProcessInfo.dwProcessId);
        MainOutMessage('日志服务器异常关闭,已被重新启动...');
      end;
    end;
  end;

  if M2Server.boGetStart then begin
    GetExitCodeProcess(M2Server.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(M2Server,IntToStr(Self.Handle),0);
      if nRetCode = 0 then begin
        CloseHandle(M2Server.ProcessHandle);
        M2Server.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,M2Server.ProcessInfo.dwProcessId);
        MainOutMessage('游戏引擎服务器异常关闭,已被重新启动...');
      end;
    end;
  end;

  if RunGate.boGetStart then begin
    GetExitCodeProcess(RunGate.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      GetMutRunGateConfing(0);
      nRetCode:=RunProgram(RunGate,IntToStr(Self.Handle),2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate.ProcessHandle);
        RunGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate.ProcessInfo.dwProcessId);
        MainOutMessage('游戏网关一异常关闭,已被重新启动...');
      end;
    end;
  end;

 { if RunGate1.boGetStart then begin
    GetExitCodeProcess(RunGate1.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      GetMutRunGateConfing(1);
      nRetCode:=RunProgram(RunGate1,IntToStr(Self.Handle),2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate1.ProcessHandle);
        RunGate1.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate1.ProcessInfo.dwProcessId);
        MainOutMessage('游戏网关二异常关闭,已被重新启动...');
      end;
    end;
  end;

  if RunGate2.boGetStart then begin
    GetExitCodeProcess(RunGate2.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      GetMutRunGateConfing(2);
      nRetCode:=RunProgram(RunGate2,IntToStr(Self.Handle),2000);
      if nRetCode = 0 then begin
        CloseHandle(RunGate2.ProcessHandle);
        RunGate2.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,RunGate2.ProcessInfo.dwProcessId);
        MainOutMessage('游戏网关三异常关闭,已被重新启动...');
      end;
    end;
  end;   }

  if SelGate.boGetStart then begin
    GetExitCodeProcess(SelGate.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(SelGate,IntToStr(Self.Handle),0);
      if nRetCode = 0 then begin
        CloseHandle(SelGate.ProcessHandle);
        SelGate.ProcessHandle:=OpenProcess(PROCESS_ALL_ACCESS,False,SelGate.ProcessInfo.dwProcessId);
        MainOutMessage('角色网关异常关闭,已被重新启动...');
      end;
    end;
  end;

  if LoginGate.boGetStart then begin
    GetExitCodeProcess(LoginGate.ProcessHandle,dwExitCode);
    if dwExitCode <> STILL_ACTIVE then begin
      nRetCode:=RunProgram(LoginGate,IntToStr(Self.Handle),0);
      if nRetCode = 0 then begin
        CloseHandle(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);
var
  sData:String;
  ProgramType:TProgamType;
  wIdent:Word;
begin
  wIdent:=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);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        DBServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
      end;
    end;
    SG_STARTNOW: begin
      MainOutMessage(sData);
    end;
    SG_STARTOK: begin
      DBServer.btStartStatus:=2;
      MainOutMessage(sData);
    end;
    SG_CHECKCODEADDR: begin
      g_dwDBCheckCodeAddr:=Str_ToInt(sData,-1);
    end;
    3: ;
  end;
end;

procedure TfrmMain.ProcessLoginGateMsg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        LoginGate.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
      end;
    end;
    SG_STARTNOW: begin
      MainOutMessage(sData);
    end;
    SG_STARTOK: begin
      LoginGate.btStartStatus:=2;
      MainOutMessage(sData);
    end;
    2: ;
    3: ;
  end;
end;

procedure TfrmMain.ProcessLoginGate1Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        LoginGate1.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);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        SelGate.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
      end;
    end;
    SG_STARTNOW: begin
      MainOutMessage(sData);
    end;
    SG_STARTOK: begin
      if SelGate.btStartStatus <> 2 then begin
        SelGate.btStartStatus:=2;
      end else begin
        SelGate1.btStartStatus:=2;
      end;
      MainOutMessage(sData);
    end;
  end;
end;

procedure TfrmMain.ProcessSelGate1Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        SelGate1.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessM2ServerMsg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        M2Server.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: begin
      M2Server.btStartStatus:=2;
      MainOutMessage(sData);
    end;
    SG_CHECKCODEADDR: begin
      g_dwM2CheckCodeAddr:=Str_ToInt(sData,-1);
    end;
  end;

end;
                                                  //sData参数是由对应的服务器程序传递过来的
procedure TfrmMain.ProcessLoginSrvMsg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        LoginServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
      end;
    end;
    SG_STARTNOW: begin
      MainOutMessage(sData); //显示消息
    end;
    SG_STARTOK: begin
      LoginServer.btStartStatus:=2;
      MainOutMessage(sData);
    end;
    SG_USERACCOUNT: begin
      ProcessLoginSrvGetUserAccount(sData);
    end;
    SG_USERACCOUNTCHANGESTATUS: begin
      ProcessLoginSrvChangeUserAccountStatus(sData);
    end;
  end;

end;

procedure TfrmMain.ProcessLogServerMsg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        LogServer.MainFormHandle:=Handle;
//        SetWindowPos(Self.Handle,Handle,Self.Left,Self.Top,Self.Width,Self.Height,$40);
      end;
    end;
    SG_STARTNOW: begin
      MainOutMessage(sData);
    end;
    SG_STARTOK: begin
      LogServer.btStartStatus:=2;
      MainOutMessage(sData);
    end;
  end;

end;



procedure TfrmMain.ProcessRunGate1Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate1.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);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate2.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGate3Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate3.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGate4Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate4.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGate5Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate5.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGate6Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate6.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGate7Msg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate7.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;

procedure TfrmMain.ProcessRunGateMsg(wIdent: Word; sData: String);
var
  Handle:THandle;
begin
  case wIdent of
    SG_FORMHANDLE: begin
      Handle:=Str_ToInt(sData,0);
      if Handle <> 0 then begin
        RunGate.MainFormHandle:=Handle;
      end;
    end;
    1: ;
    2: ;
    3: ;
  end;

end;



procedure TfrmMain.EditSkinChange(Sender: TObject);
begin
 { if EditSkin.Text = '' then begin
    EditSkin.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nFormIdx:=EditSkin.Value;
  if g_nFormIdx >= 0 then begin
    SkinData.LoadFromCollection(SkinStore,g_nFormIdx);
    if not SkinData.Active then SkinData.Active:=True;
  end else begin
    SkinData.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);
begin
  LoadConfig();
  RefGameConsole();
  Application.MessageBox('配置重加载完成...','提示信息',MB_OK + MB_ICONINFORMATION);
end;

procedure TfrmMain.EditLoginGate_MainFormXChange(Sender: TObject);
begin
  if EditLoginGate_MainFormX.Text = '' then begin
    EditLoginGate_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLoginGate_MainFormX:=EditLoginGate_MainFormX.Value;
end;

procedure TfrmMain.EditLoginGate_MainFormYChange(Sender: TObject);
begin
  if EditLoginGate_MainFormY.Text = '' then begin
    EditLoginGate_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLoginGate_MainFormY:=EditLoginGate_MainFormY.Value;
end;

procedure TfrmMain.CheckBoxboLoginGate_GetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boLoginGate_GetStart:=CheckBoxboLoginGate_GetStart.Checked;
end;

procedure TfrmMain.EditSelGate_MainFormXChange(Sender: TObject);
begin
  if EditSelGate_MainFormX.Text = '' then begin
    EditSelGate_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nSelGate_MainFormX:=EditSelGate_MainFormX.Value;
end;

procedure TfrmMain.EditSelGate_MainFormYChange(Sender: TObject);
begin
  if EditSelGate_MainFormY.Text = '' then begin
    EditSelGate_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nSelGate_MainFormY:=EditSelGate_MainFormY.Value;
end;

procedure TfrmMain.CheckBoxboSelGate_GetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boSelGate_GetStart:=CheckBoxboSelGate_GetStart.Checked;
end;
procedure TfrmMain.EditLoginServer_MainFormXChange(Sender: TObject);
begin
  if EditLoginServer_MainFormX.Text = '' then begin
    EditLoginServer_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLoginServer_MainFormX:=EditLoginServer_MainFormX.Value;
end;

procedure TfrmMain.EditLoginServer_MainFormYChange(Sender: TObject);
begin
  if EditLoginServer_MainFormY.Text = '' then begin
    EditLoginServer_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLoginServer_MainFormY:=EditLoginServer_MainFormY.Value;
end;

procedure TfrmMain.CheckBoxboLoginServer_GetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boLoginServer_GetStart:=CheckBoxboLoginServer_GetStart.Checked;
end;

procedure TfrmMain.EditDBServer_MainFormXChange(Sender: TObject);
begin
  if EditDBServer_MainFormX.Text = '' then begin
    EditDBServer_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nDBServer_MainFormX:=EditDBServer_MainFormX.Value;
end;

procedure TfrmMain.EditDBServer_MainFormYChange(Sender: TObject);
begin
  if EditDBServer_MainFormY.Text = '' then begin
    EditDBServer_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nDBServer_MainFormY:=EditDBServer_MainFormY.Value;
end;

procedure TfrmMain.CheckBoxDisableAutoGameClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boDBServer_DisableAutoGame:=CheckBoxDisableAutoGame.Checked;
end;


procedure TfrmMain.CheckBoxDBServerGetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boDBServer_GetStart:=CheckBoxDBServerGetStart.Checked;
end;

procedure TfrmMain.EditLogServer_MainFormXChange(Sender: TObject);
begin
  if EditLogServer_MainFormX.Text = '' then begin
    EditLogServer_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLogServer_MainFormX:=EditLogServer_MainFormX.Value;
end;

procedure TfrmMain.EditLogServer_MainFormYChange(Sender: TObject);
begin
  if EditLogServer_MainFormY.Text = '' then begin
    EditLogServer_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nLogServer_MainFormY:=EditLogServer_MainFormY.Value;
end;


procedure TfrmMain.CheckBoxLogServerGetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boLogServer_GetStart:=CheckBoxLogServerGetStart.Checked;
end;

procedure TfrmMain.EditM2Server_MainFormXChange(Sender: TObject);
begin
  if EditM2Server_MainFormX.Text = '' then begin
    EditM2Server_MainFormX.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nM2Server_MainFormX:=EditM2Server_MainFormX.Value;
end;

procedure TfrmMain.EditM2Server_MainFormYChange(Sender: TObject);
begin
  if EditM2Server_TestLevel.Text = '' then begin
    EditM2Server_TestLevel.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nM2Server_TestLevel:=EditM2Server_TestLevel.Value;
end;


procedure TfrmMain.EditM2Server_TestLevelChange(Sender: TObject);
begin
  if EditM2Server_MainFormY.Text = '' then begin
    EditM2Server_MainFormY.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nM2Server_MainFormY:=EditM2Server_MainFormY.Value;
end;


procedure TfrmMain.EditM2Server_TestGoldChange(Sender: TObject);
begin
  if EditM2Server_TestGold.Text = '' then begin
    EditM2Server_TestGold.Text:='0';
  end;
  if not m_boOpen then exit;
  g_nM2Server_TestGold:=EditM2Server_TestGold.Value;
end;

procedure TfrmMain.CheckBoxM2ServerGetStartClick(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_boM2Server_GetStart:=CheckBoxM2ServerGetStart.Checked;
end;


procedure TfrmMain.MemoLogChange(Sender: TObject);
begin
  if MemoLog.Lines.Count > 100 then
    MemoLog.Clear;
end;

procedure TfrmMain.FormActivate(Sender: TObject);
var
  name: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) then
    begin
if FrmRegNotice.Reg.Registered then
begin
  IdHTTP1 := 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; //提交参数
  try
    aParams.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-18
    begin
      //if DaysBetween(ToDay,StrToDate(RegEndDateStr)) <= 0 then
      if Comparedate(StrToDateTime(RegEndDateStr),Now()) <= 0 then
      begin
        MainOutMessage('授权到期:'+RegEndDateStr); //显示消息
        FrmRegNotice.Reg.Days := 360;
        FrmRegNotice.Reg.RegCodeSize := 20;
        FrmRegNotice.Reg.SetUnregistered;
        close;
      end else  MainOutMessage('授权时间:'+RegEndDateStr); //显示消息
    end  else begin
        showmessage('在线激活失败,请联系客服QQ:123563499');
        close;
    end;

  finally
    IdHTTP1.Free;
    aParams.Free;
    aStream.Free;
  end;
end;
end ; }
end;

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if m_nStartStatus = 2 then begin
  //  if Application.MessageBox('游戏服务器正在运行,是否停止游戏服务器 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin
      ButtonStartGameClick(ButtonStartGame);
  //  end;
    CanClose:=False;
    exit;
  end;

  CanClose:=True;
 {//直接关闭无需确认
  if Application.MessageBox('是否确认关闭《Delphi传奇》网络反外挂数据引擎控制台 ?','确认信息',MB_YESNO + MB_ICONQUESTION) = mrYes then begin
    CanClose:=True;
  end else begin
    CanClose:=False;
  end;   }
end;


//如果存在多个GameGate网关则调用该函数
procedure TfrmMain.GetMutRunGateConfing(nIndex: Integer);
var
  IniGameConf:TIniFile;
  sIniFile:String;
  sGateAddr:String;
  nGatePort:Integer;
begin
  case nIndex of    //
    0: begin
      sGateAddr:=g_sRunGate_GateAddr;
      nGatePort:=g_nRunGate_GatePort;
    end;
    1: begin
      sGateAddr:=g_sRunGate1_GateAddr;
      nGatePort:=g_nRunGate1_GatePort;
    end;
    2: begin
      sGateAddr:=g_sRunGate2_GateAddr;
      nGatePort:=g_nRunGate2_GatePort;
    end;
    3: begin
      sGateAddr:=g_sRunGate3_GateAddr;
      nGatePort:=g_nRunGate3_GatePort;
    end;
    4: begin
      sGateAddr:=g_sRunGate4_GateAddr;
      nGatePort:=g_nRunGate4_GatePort;
    end;
    5: begin
      sGateAddr:=g_sRunGate5_GateAddr;
      nGatePort:=g_nRunGate5_GatePort;
    end;
    6: begin
      sGateAddr:=g_sRunGate6_GateAddr;
      nGatePort:=g_nRunGate6_GatePort;
    end;
    7: begin
      sGateAddr:=g_sRunGate7_GateAddr;
      nGatePort:=g_nRunGate7_GatePort;
    end;
  end;

  sIniFile:=g_sGameDirectory + g_sRunGate_Directory; //GameGate.ini
  if not DirectoryExists(sIniFile) then begin
    CreateDir(sIniFile); //创建路径
  end;
  IniGameConf:=TIniFile.Create(sIniFile + g_sRunGate_ConfigFile);  //创建GameGate.ini
  IniGameConf.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);
begin
  ShellExecute(Application.Handle, nil, Pchar('http://www.delphii.com'), nil,
                 nil, SW_SHOWNOACTIVATE);
end;

procedure TfrmMain.EditRunGate_ConntChange(Sender: TObject);
begin
  if EditRunGate_Connt.Text = '' then begin
    EditRunGate_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 begin
    g_sDBServer_Config_GateAddr:=g_sAllIPaddr;
  end else begin
    g_sDBServer_Config_GateAddr:=g_sLocalIPaddr;
  end;
  RefGameConsole();
end;

procedure TfrmMain.ButtonLoginServerConfigClick(Sender: TObject);
begin
  frmLoginServerConfig.Open;
end;

procedure TfrmMain.ButtonAdvClick(Sender: TObject);
begin
  frmCertServerSet.Open;
end;

procedure TfrmMain.CheckBoxDynamicIPModeClick(Sender: TObject);
begin
  EditGameExtIPaddr.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;
  try
    ServerSocket.Address:=g_sServerAddr;
    ServerSocket.Port:=g_nServerPort;
    ServerSocket.Active:=false;//True; //开始启动服务器准备接受客户端(登录器)的连接
    m_dwShowTick:=GetTickCount();
    Timer.Enabled:=false;//true; //启动定时器 处理 客户端(登录器)的消息
  except
    on e: ESocketError do begin
      MainOutMessage(format('端口%d打开异常,检查端口是否被其它程序占用!例如:路由器等',[g_nServerPort]));
      MainOutMessage(E.Message);
      exit;
    end;

  end;
  MainOutMessage('《Delphi传奇》网络游戏引擎控制台启动完成...');
  Result:=True;
end;

procedure TfrmMain.StopService;
begin
  Timer.Enabled:=False;
  g_SessionList.Free;
  g_IniConf.Free;
end;
//处理客户端封包
procedure TfrmMain.ProcessClientPacket;
var
  I: Integer;
  sLineText,sData,sDefMsg:String;
  nDataLen:Integer;
  DefMsg:TDefaultMessage;
  Socket:TCustomWinSocket;
begin
  for I := 0 to g_SessionList.Count - 1 do begin
    Socket:=TCustomWinSocket(g_SessionList.Objects[I]);
    sLineText:=g_SessionList.Strings[I];
    if sLineText = '' then Continue;
    while TagCount(sLineText,'!') > 0 do begin
      sLineText:=ArrestStringEx(sLineText,'#','!',sData);
      nDataLen:=length(sData);
      if (nDataLen >= DEFBLOCKSIZE) then begin
        sDefMsg:=Copy(sData,1,DEFBLOCKSIZE);
        DefMsg:=DecodeMessage(sDefMsg);
        case DefMsg.Ident of
          CM_GETGAMELIST: begin
            SendGameList(Socket);
          end;

        end;
      end;
    end;
    g_SessionList.Strings[I]:=sLineText;
  end;
end;
//向客户端发送SM_SENDGAMELIST LoginGate 游戏登录网关服务器的地址.以便于客户端连接
procedure TfrmMain.SendGameList(Socket: TCustomWinSocket);
var
  I: Integer;
  DefMsg:TDefaultMessage;
  sLineText:String;
  sNoticeUrl:String;
begin
  sNoticeUrl:=Trim(EditNoticeUrl.Text);
  DefMsg:=MakeDefaultMsg(SM_SENDGAMELIST,0,0,0,0);
  for I := 0 to MemoGameList.Lines.Count - 1 do begin
    sLineText:=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);
begin
  SendMsg:='#' + SendMsg + '!';
  if Socket.Connected then
    Socket.SendText(SendMsg);
end;
//连接
procedure TfrmMain.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I: Integer;
  boFound:Boolean;
begin
  boFound:=False;
  for I := 0 to g_SessionList.Count - 1 do begin
    if g_SessionList.Objects[I] = Socket then begin
      boFound:=True;
      break;
    end;
  end;
  if not boFound then begin
    g_SessionList.AddObject('',Socket)
  end;
end;
//中止连接
procedure TfrmMain.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I: Integer;
begin
  for I := 0 to g_SessionList.Count - 1 do begin
    if g_SessionList.Objects[I] = Socket then begin
      g_SessionList.Delete(I);
      break;
    end;
  end;
end;
//连接出错
procedure TfrmMain.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ErrorCode:=0;
  Socket.Close;
end;
//接收数据
procedure TfrmMain.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I: Integer;
begin
  for I := 0 to g_SessionList.Count - 1 do begin
    if g_SessionList.Objects[I] = Socket then begin
      g_SessionList.Strings[I]:=g_SessionList.Strings[I] + Socket.ReceiveText;
      break;
    end;
  end;
end;
//检查客户端连接数 并处理客户端封包
procedure TfrmMain.TimerTimer(Sender: TObject);
begin
  ProcessClientPacket();
  if GetTickCount - m_dwShowTick > 1000 then begin
    m_dwShowTick:=GetTickCount();
    LabelConnect.Caption:=format('端口:%d   当前连接数:%d',[ServerSocket.Port,ServerSocket.Socket.ActiveConnections]);
  end;
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
  MemoGameList.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);
begin
  if not m_boOpen then exit;
  g_sNoticeUrl:=Trim(EditNoticeUrl.Text);
  Button2.Enabled:=True;
end;

procedure TfrmMain.EditClientFormChange(Sender: TObject);
begin
  if not m_boOpen then exit;
  g_nClientForm:=EditClientForm.Value;
  Button2.Enabled:=True;
end;

procedure TfrmMain.MemoGameListChange(Sender: TObject);
begin
  if not m_boOpen then exit;

  Button2.Enabled:=True;
end;

procedure TfrmMain.ButtonGeneralDefalultClick(Sender: TObject);
begin
  EditGameDir.Text:='D:\MMORPGServer\';
  EditHeroDB.Text:='HeroDB';
  EditGameName.Text:='Delphi传奇';
  EditGameExtIPaddr.Text:='127.0.0.1';
  CheckBoxDynamicIPMode.Checked:=False;
end;

procedure TfrmMain.ButtonRunGateDefaultClick(Sender: TObject);
begin
  EditRunGate_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);
begin
  EditLoginGate_MainFormX.Text:='0';
  EditLoginGate_MainFormY.Text:='0';
  EditLoginGate_GatePort.Text:='7000';
end;

procedure TfrmMain.ButtonSelGateDefaultClick(Sender: TObject);
begin
  EditSelGate_MainFormX.Text:='0';
  EditSelGate_MainFormY.Text:='163';
  EditSelGate_GatePort.Text:='7100';
end;

procedure TfrmMain.ButtonLoginSrvDefaultClick(Sender: TObject);
begin
  EditLoginServer_MainFormX.Text:='251';
  EditLoginServer_MainFormY.Text:='0';
  EditLoginServerGatePort.Text:='5500';
  EditLoginServerServerPort.Text:='5600';
  CheckBoxboLoginServer_GetStart.Checked:=True;
end;

procedure TfrmMain.ButtonDBServerDefaultClick(Sender: TObject);
begin
  EditDBServer_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);
begin
  EditLogServer_MainFormX.Text:='251';
  EditLogServer_MainFormY.Text:='239';
  EditLogServerPort.Text:='10000';
  CheckBoxLogServerGetStart.Checked:=True;
end;

procedure TfrmMain.ButtonM2ServerDefaultClick(Sender: TObject);
begin
  EditM2Server_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);
var
  sAccount:String;
begin
  if LoginServer.btStartStatus <> 2 then begin
    Application.MessageBox('游戏登录服务器未启动!!!' + #13#13 + '启动游戏登录服务器后才能使用此功能。','提示信息',MB_OK + MB_ICONINFORMATION);
    exit;
  end;
  sAccount:=Trim(EditSearchLoginAccount.Text);
  if sAccount = '' then begin
    Application.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);
var
  DBRecord:TAccountDBRecord;
  DefMsg:TDefaultMessage;
  sDefMsg:String;
begin
  if 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: begin
      Application.MessageBox('帐号未找到!!!','提示信息',MB_OK + MB_ICONINFORMATION);
      exit;
    end;
    else begin
      DecodeBuffer(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);
begin
  ButtonLoginAccountOK.Enabled:=True;
end;
procedure TfrmMain.CkFullEditModeClick(Sender: TObject);
begin
  UserAccountEditMode(CkFullEditMode.Checked);
end;

procedure TfrmMain.UserAccountEditMode(boChecked: Boolean);
begin
  boChecked:=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);
var
  DBRecord:TAccountDBRecord;
  DefMsg:TDefaultMessage;
  sDefMsg:String;
  sAccount,sPassword,sUserName,sSSNo,sPhone,sQuiz,sAnswer,sEMail,sQuiz2,sAnswer2,sBirthDay,sMobilePhone,sMemo,sMemo2:String;
begin
  sAccount     :=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 begin
    Application.MessageBox('帐号不能不空!!!','提示信息',MB_OK + MB_ICONERROR);
    EditLoginAccount.SetFocus;
    exit;
  end;
  if sPassword = '' then begin
    Application.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);
var
  DefMsg:TDefaultMessage;
  sDefMsg:String;
begin
  if 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;
var
  CheckCode:TCheckCode;
  dwReturn:LongWord;
begin
  EditM2CheckCodeAddr.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 begin
    EditM2CheckCode.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 begin
    EditDBCheckCode.Text:=IntToStr(CheckCode.dwThread0);
    EditDBCheckStr.Text:=String(CheckCode.sThread0);
  end;
end;

procedure TfrmMain.TimerCheckDebugTimer(Sender: TObject);
begin
  RefGameDebug();
end;

procedure TfrmMain.ButtonM2SuspendClick(Sender: TObject);
begin
  SuspendThread(M2Server.ProcessInfo.hThread);
end;


end.
发布了58 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xyzhan/article/details/102736739