⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmain.pas

📁 千年源代码,只缺少控件,可以做二次开发用,好不容易得来的
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit FMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ScktComp, ComCtrls, ExtCtrls, IniFiles, mmSystem, uBuffer, NMUDP,
  uPackets, AnsStringCls, DefType;

type
  TVillageData = record
    Name : String[64];
    X : Integer;
    Y : Integer;
    ServerID : Integer;
  end;
  PTVillageData = ^TVillageData;

  TfrmMain = class(TForm)
    pgMain: TPageControl;
    tsStatus: TTabSheet;
    tsEvent: TTabSheet;
    lstEvent: TListBox;
    tsLog: TTabSheet;
    txtLog: TMemo;
    sckUserAccept: TServerSocket;
    cmdClose: TButton;
    timerDisplay: TTimer;
    StaticText1: TStaticText;
    shpGameConnected: TShape;
    shpDBConnected: TShape;
    StaticText2: TStaticText;
    StaticText3: TStaticText;
    StaticText4: TStaticText;
    StaticText5: TStaticText;
    StaticText6: TStaticText;
    lblConnectCount: TStaticText;
    lblPlayCount: TStaticText;
    lblLogCount: TStaticText;
    lblConnectID: TStaticText;
    StaticText11: TStaticText;
    lblElaspedTime: TStaticText;

    // sckGameConnect: TClientSocket;
    sckDBConnect: TClientSocket;
    sckLoginConnect: TClientSocket;
    shpLoginConnected: TShape;
    StaticText7: TStaticText;
    timerProcess: TTimer;
    chkUserAccept: TCheckBox;
    tsBufferStatus: TTabSheet;
    Label1: TLabel;
    lblGameSendBytes: TLabel;
    Label2: TLabel;
    lblGameRecvBytes: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    lblDBSendBytes: TLabel;
    Label8: TLabel;
    lblDBRecvBytes: TLabel;
    Label10: TLabel;
    lblLoginSendBytes: TLabel;
    Label12: TLabel;
    lblLoginRecvBytes: TLabel;
    Label3: TLabel;
    lblGameWBCount: TLabel;
    Label7: TLabel;
    lblDBWBCount: TLabel;
    Label11: TLabel;
    lblLoginWBCount: TLabel;
    shpGameWBSign: TShape;
    Label9: TLabel;
    shpDBWBSign: TShape;
    Label13: TLabel;
    shpLoginWBSign: TShape;
    Label14: TLabel;
    sckGameConnect: TClientSocket;
    timerClose: TTimer;
    udpBalance: TNMUDP;
    cmdReCalc: TButton;
    sckPaidConnect: TClientSocket;
    shpPaidConnected: TShape;
    StaticText8: TStaticText;
    procedure cmdCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure sckUserAcceptAccept(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckUserAcceptClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckUserAcceptClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckUserAcceptClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure sckUserAcceptClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckUserAcceptClientWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure timerDisplayTimer(Sender: TObject);
    procedure sckDBConnectConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckDBConnectDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckDBConnectError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure sckDBConnectRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckDBConnectWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckLoginConnectConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckLoginConnectDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckLoginConnectError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure sckLoginConnectRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckLoginConnectWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure timerProcessTimer(Sender: TObject);
    procedure sckGameConnectConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckGameConnectDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckGameConnectError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure sckGameConnectRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckGameConnectWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure timerCloseTimer(Sender: TObject);
    procedure udpBalanceDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    procedure cmdReCalcClick(Sender: TObject);
    procedure sckPaidConnectConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckPaidConnectDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckPaidConnectError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure sckPaidConnectRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure sckPaidConnectWrite(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure AddLog (aStr : String);
    procedure AddEvent (aStr : String);

    function UpdateServer (CurTick : Integer) : Boolean;
  end;

var
  frmMain: TfrmMain;

  StartTick, ElaspedSec : Integer;
  BalanceSendTick : Integer;

  RejectCharName : TStringList;

  ServerName : String;
  LimitUserCount : Integer;
  boCheckPaidInfo : Boolean;
  BufferSizeS2S, BufferSizeS2C : Integer;
  UserAcceptInfo, GameConnectInfo, DBConnectInfo, LoginConnectInfo : TConnectInfo;
  BalanceConnectInfo, PaidConnectInfo : TConnectInfo;

  VillageList : TList;

  GameSender, DBSender, LoginSender, PaidSender : TPacketSender;
  GameReceiver, DBReceiver, LoginReceiver, PaidReceiver : TPacketReceiver;

implementation

uses
   uConnector;

{$R *.DFM}

procedure TfrmMain.cmdCloseClick(Sender: TObject);
begin
   if Application.MessageBox ('Do you want to exit program?', 'GATE SERVER', MB_OKCANCEL) <> ID_OK then exit;
    
   if ConnectorList <> nil then begin
   	ConnectorList.Free;
   	ConnectorList := nil;
   end;
   
   Close;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
   i, nCount : Integer;
   iniFile : TIniFile;
   pd : PTVillageData;
begin
   AddLog ('Gate Server Started ' + DateToStr(Date) + ' ' + TimeToStr (Time));

   ElaspedSec := 0;
   StartTick := timeGetTime;

   VillageList := TList.Create;

   RejectCharName := TStringList.Create;
   if FileExists ('.\DONTCHAR.TXT') then begin
      RejectCharName.LoadFromFile ('.\DONTCHAR.TXT');
   end;

   if not FileExists ('.\GATE.INI') then begin
      iniFile := TIniFile.Create ('.\GATE.INI');

      iniFile.WriteString ('GATE_SERVER', 'LOCALIP', '192.168.0.109');
      iniFile.WriteInteger ('GATE_SERVER', 'LOCALPORT', 3054);
      iniFile.WriteString ('GATE_SERVER', 'SERVERNAME', '芒炼');
      iniFile.WriteInteger ('GATE_SERVER', 'LIMITUSERCOUNT', 0);
      iniFile.WriteString ('GATE_SERVER', 'CHECKPAIDINFO', 'TRUE');
      iniFile.WriteInteger ('GATE_SERVER', 'BUFFERSIZES2S', 16384);
      iniFile.WriteInteger ('GATE_SERVER', 'BUFFERSIZES2C', 8192);

      iniFile.WriteString ('DB_SERVER', 'REMOTEIP', '192.168.0.109');
      iniFile.WriteInteger ('DB_SERVER', 'REMOTEPORT', 3052);

      iniFile.WriteString ('DB_SERVER', 'REMOTEIP', '192.168.0.109');
      iniFile.WriteInteger ('DB_SERVER', 'REMOTEPORT', 3051);

      iniFile.WriteString ('LOGIN_SERVER', 'REMOTEIP', '192.168.0.109');
      iniFile.WriteInteger ('LOGIN_SERVER', 'REMOTEPORT', 3050);

      iniFile.WriteString ('PAID_SERVER', 'REMOTEIP', '192.168.0.109');
      iniFile.WriteInteger ('PAID_SERVER', 'REMOTEPORT', 5999);
      iniFile.WriteInteger ('PAID_SERVER', 'LOCALPORT', 5998);

      iniFile.WriteString ('GATE_SERVER', 'BALANCEIP', '192.168.0.109');
      iniFile.WriteInteger ('GATE_SERVER', 'BALANCEPORT', 3030);

      iniFile.Free;
   end;

   iniFile := TIniFile.Create ('.\GATE.INI');

   UserAcceptInfo.RemoteIP := iniFile.ReadString ('GATE_SERVER', 'LOCALIP', '192.168.0.109');
   UserAcceptInfo.LocalPort := iniFile.ReadInteger ('GATE_SERVER', 'LOCALPORT', 3054);
   ServerName := iniFile.ReadString ('GATE_SERVER', 'SERVERNAME', '芒炼');
   LimitUserCount := iniFile.ReadInteger ('GATE_SERVER', 'LIMITUSERCOUNT', 0);
   boCheckPaidInfo := true;
   if UpperCase (iniFile.ReadString ('GATE_SERVER', 'CHECKPAIDINFO', 'TRUE')) = 'FALSE' then begin
      boCheckPaidInfo := false;
   end; 
   BufferSizeS2S := iniFile.ReadInteger ('GATE_SERVER', 'BUFFERSIZES2S', 16384);
   BufferSizeS2C := iniFile.ReadInteger ('GATE_SERVER', 'BUFFERSIZES2C', 8192);

   GameConnectInfo.RemoteIP := iniFile.ReadString ('GAME_SERVER', 'REMOTEIP', '192.168.0.109');
   GameConnectInfo.RemotePort := iniFile.ReadInteger ('GAME_SERVER', 'REMOTEPORT', 3052);

   DBConnectInfo.RemoteIP := iniFile.ReadString ('DB_SERVER', 'REMOTEIP', '192.168.0.109');
   DBConnectInfo.RemotePort := iniFile.ReadInteger ('DB_SERVER', 'REMOTEPORT', 3051);

   LoginConnectInfo.RemoteIP := iniFile.ReadString ('LOGIN_SERVER', 'REMOTEIP', '192.168.0.109');
   LoginConnectInfo.RemotePort := iniFile.ReadInteger ('LOGIN_SERVER', 'REMOTEPORT', 3050);

   PaidConnectInfo.RemoteIP := iniFile.ReadString ('PAID_SERVER', 'REMOTEIP', '192.168.0.109');
   PaidConnectInfo.RemotePort := iniFile.ReadInteger ('PAID_SERVER', 'REMOTEPORT', 3049);

   BalanceConnectInfo.RemoteIP := iniFile.ReadString ('GATE_SERVER', 'BALANCEIP', '192.168.0.109');
   BalanceConnectInfo.RemotePort := iniFile.ReadInteger ('GATE_SERVER', 'BALANCEPORT', 3030);

   iniFile.Free;

   iniFile := TIniFile.Create ('.\Village.INI');
   nCount := iniFile.ReadInteger ('VILLAGE', 'COUNT', 1);
   for i := 0 to nCount - 1 do begin
      New (pd);
      pd^.Name := iniFile.ReadString ('VILLAGE', 'NAME' + IntToStr (i), '急厚锰');
      pd^.X := iniFile.ReadInteger ('VILLAGE', 'X' + IntToStr (i), 513);
      pd^.Y := iniFile.ReadInteger ('VILLAGE', 'Y' + IntToStr (i), 205);
      pd^.ServerID := iniFile.ReadInteger ('VILLAGE', 'ServerID' + IntToStr (i), 0);
      VillageList.Add (pd);
   end;
   iniFile.Free;

   GameSender := nil;
   GameReceiver := nil;
   DBSender := nil;
   DBReceiver := nil;
   LoginSender := nil;
   LoginReceiver := nil;
   PaidSender := nil;
   PaidReceiver := nil;

   ConnectorList := TConnectorList.Create;

   chkUserAccept.Checked := true;

   sckUserAccept.Port := UserAcceptInfo.LocalPort;
   sckUserAccept.Active := true;

   sckGameConnect.Address := GameConnectInfo.RemoteIP;
   sckGameConnect.Port := GameConnectInfo.RemotePort;
   sckGameConnect.Active := true;

   sckDBConnect.Address := DBConnectInfo.RemoteIP;
   sckDBConnect.Port := DBConnectInfo.RemotePort;
   sckDBConnect.Active := true;

   sckLoginConnect.Address := LoginConnectInfo.RemoteIP;
   sckLoginConnect.Port := LoginConnectInfo.RemotePort;
   sckLoginConnect.Active := true;

   sckPaidConnect.Address := PaidConnectInfo.RemoteIP;
   sckPaidConnect.Port := PaidConnectInfo.RemotePort;
   sckPaidConnect.Active := true;

   timerDisplay.Interval := 1000;
   timerDisplay.Enabled := true;

   timerProcess.Interval := 10;
   timerProcess.Enabled := true;

   timerClose.Enabled := false;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
var
   i : Integer;
   pd : PTVillageData;
begin
   for i := 0 to VillageList.Count - 1 do begin
      pd := VillageList.Items [i];
      Dispose (pd);
   end;
   VillageList.Clear;
   VillageList.Free;

   if ConnectorList <> nil then begin
   	ConnectorList.Free;
   	ConnectorList := nil;
   end;

   if sckGameConnect.Socket.Connected = true then begin
      sckGameConnect.Socket.Close;
   end;
   if sckDBConnect.Socket.Connected = true then begin
      sckDBConnect.Socket.Close;
   end;
   if sckLoginConnect.Socket.Connected = true then begin
      sckLoginConnect.Socket.Close;
   end;
   if sckUserAccept.Active = true then begin
      sckUserAccept.Socket.Close;
   end;
   timerDisplay.Enabled := false;
   timerProcess.Enabled := false;

   if GameSender <> nil then begin
      GameSender.Free;
      GameSender := nil;
   end;
   if GameReceiver <> nil then begin
      GameReceiver.Free;
      GameReceiver := nil;
   end;

   if DBSender <> nil then begin
      DBSender.Free;
      DBSender := nil;
   end;
   if DBReceiver <> nil then begin
      DBReceiver.Free;
      DBReceiver := nil;
   end;
   if LoginSender <> nil then begin
      LoginSender.Free;
      LoginSender := nil;
   end;
   if LoginReceiver <> nil then begin
      LoginReceiver.Free;
      LoginReceiver := nil;
   end;

   RejectCharName.Clear;
   RejectCharName.Free;

   AddLog ('Gate Server Exit ' + DateToStr(Date) + ' ' + TimeToStr (Time));
end;

procedure TfrmMain.AddLog (aStr : String);
begin
   if txtLog.Lines.Count >= 30 then begin
      txtLog.Lines.Delete (0);
   end;
   txtLog.Lines.Add (aStr);
end;

procedure TfrmMain.AddEvent (aStr : String);
begin
   if lstEvent.Items.Count >= 30 then begin
      lstEvent.Items.Delete (0);
   end;
   lstEvent.Items.Add (aStr);
   lstEvent.ItemIndex := lstEvent.Items.Count - 1;
end;

function TfrmMain.UpdateServer (CurTick : Integer) : Boolean;
var
   Packet : TPacketData;
begin
   if GameSender <> nil then GameSender.Update;
   if GameReceiver <> nil then begin
      GameReceiver.Update;
      while GameReceiver.Count > 0 do begin
         if GameReceiver.GetPacket (@Packet) = false then break;
         ConnectorList.GameMessageProcess (@Packet);
      end;
   end;

   if DBSender <> nil then DBSender.Update;
   if DBReceiver <> nil then begin
      DBReceiver.Update;
      while DBReceiver.Count > 0 do begin
         if DBReceiver.GetPacket (@Packet) = false then break;
         ConnectorList.DBMessageProcess (@Packet);
      end;
   end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -