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

📄 lmain.pas

📁 传奇服务端代码 LoginSrvSQL 通讯部分
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit LMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, JSocket, SyncObjs,
  Grids, Buttons, IniFiles, MudUtil, SDK, Parse,
  Menus, Grobal2, LSShare, ComCtrls;

type
  TConnInfo = record      //Size 0x20 Address: 0x00468601
    sAccount: string;     //0x00
    sIPaddr:  string;     //0x04
    sServerName: string;  //0x08
    nSessionID: integer;  //0x0C
    boPayCost: boolean;   //0x10
    dwKickTick: longword; //0x14
    dwStartTick: longword;//0x18
    boKicked: boolean;    //0x1C
    nLockCount: integer;
  end;
  pTConnInfo = ^TConnInfo;

  pTGateInfo = ^TGateInfo;
  TGateInfo = record //Size 0x14 Address: 0x004686A0
    Socket:      TCustomWinSocket; //0x00
    sIPaddr:     string;           //0x04
    sReceiveMsg: string;           //0x08
    UserList:    TList;            //0x0C
    dwKeepAliveTick: longword;         //0x10
  end;

  pTUserInfo = ^TUserInfo;
  TUserInfo = record //Size 0x68 Address: 0x004686C8
    sAccount:  string;            //0x00
    sUserIPaddr: string;            //0x0B
    sGateIPaddr: string;            //用户连接到网关,网关的连接IP
    sSockIndex: string;            //0x20
    nVersionDate: integer;           //0x24
    boCertificationOK: boolean;           //0x28
    bo29:      boolean;           //0x29
    bo2A:      boolean;           //0x2A
    bo2B:      boolean;           //0x2B
    nSessionID: integer;           //0x2C
    boPayCost: boolean;           //0x30
    nIDDay:    integer;           //0x34
    nIDHour:   integer;           //0x38
    nIPDay:    integer;           //0x3C
    nIPHour:   integer;           //0x40
    dtDateTime: TDateTime;         //0x48
    boSelServer: boolean;           //0x50
    bo51:      boolean;           //0x51
    Socket:    TCustomWinSocket;  //0x54
    sReceiveMsg: string;            //0x58
    dwTime5C:  longword;          //0x5C
    bo60:      boolean;           //0x60
    bo61:      boolean;           //0x61
    bo62:      boolean;           //0x62
    bo63:      boolean;           //0x63
    dwClientTick: longword;          //0x64
    Gate:      pTGateInfo;
  end;

  TFrmMain = class(TForm)
    GSocket:    TServerSocket;
    ExecTimer:  TTimer;
    Timer1:     TTimer;
    StartTimer: TTimer;
    WebLogTimer: TTimer;
    LogTimer:   TTimer;
    CountLogTimer: TTimer;
    MonitorTimer: TTimer;
    MainMenu:   TMainMenu;
    MENU_CONTROL: TMenuItem;
    MENU_CONTROL_EXIT: TMenuItem;
    MENU_VIEW:  TMenuItem;
    MENU_OPTION: TMenuItem;
    MENU_HELP:  TMenuItem;
    MENU_HELP_ABOUT: TMenuItem;
    MENU_OPTION_ROUTE: TMenuItem;
    MENU_VIEW_SESSION: TMenuItem;
    R1: TMenuItem;
    C1: TMenuItem;
    G1: TMenuItem;
    BtnDump: TSpeedButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Memo1: TMemo;
    TabSheet2: TTabSheet;
    MonitorGrid: TStringGrid;
    TabSheet3: TTabSheet;
    LbMasCount: TLabel;
    Label1: TLabel;
    CkLogin: TCheckBox;
    CbViewLog: TCheckBox;
    Button1: TButton;
    BtnView: TButton;
    BtnShowServerUsers: TButton;
    Button2: TButton;
    Button3: TButton;

    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ExecTimerTimer(Sender: TObject);
    procedure Memo1DblClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure StartTimerTimer(Sender: TObject);

    procedure BtnViewClick(Sender: TObject);
    procedure CountLogTimerTimer(Sender: TObject);
    procedure BtnShowServerUsersClick(Sender: TObject);
    procedure MonitorTimerTimer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
    procedure GSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure GSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    procedure GSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: integer);
    procedure GSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Panel2DblClick(Sender: TObject);
    procedure CbViewLogClick(Sender: TObject);
    procedure MENU_CONTROL_EXITClick(Sender: TObject);
    procedure MENU_OPTION_ROUTEClick(Sender: TObject);
    procedure MENU_VIEW_SESSIONClick(Sender: TObject);
    procedure R1Click(Sender: TObject);
    procedure C1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure G1Click(Sender: TObject);
    procedure MENU_HELP_ABOUTClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    //sGateIPaddr     :String;      //0x334
    //GateList        :TList;  //0x338
    //SessionList     :TList; //0x33C
    //ServerNameList  :TStringList;   //0x340
    SList_0344: TStringList;   //0x344
    //AccountCostList :TQuickList;   //0x348
    //IPaddrCostList  :TQuickList;   //0x34C
    ParseList:  TThreadParseList;   //0x350
    //m_boRemoteClose :Boolean;

    procedure GameCenterGetUserAccount(sData: string);
    procedure GameCenterChangeAccountInfo(sData: string);
    procedure OpenRouteConfig();
  public
    { Public declarations }
  end;

procedure StartService(Config: pTConfig);
procedure StopService(Config: pTConfig);
procedure InitializeConfig(Config: pTConfig);
procedure UnInitializeConfig(Config: pTConfig);
procedure LoadConfig(Config: pTConfig);
procedure LoadAddrTable(Config: pTConfig);
procedure GenServerNameList(Config: pTConfig);

procedure WriteLogMsg(Config: pTConfig; sType: string; var UserEntry: TUserEntry;
  var UserAddEntry: TUserEntryAdd);
procedure SaveContLogMsg(Config: pTConfig; sLogMsg: string);

procedure SendGateMsg(Socket: TCustomWinSocket; sSockIndex, sMsg: string);
procedure SendGateKickMsg(Socket: TCustomWinSocket; sSockIndex: string);
procedure SendKeepAlivePacket(Socket: TCustomWinSocket);

procedure SessionAdd(Config: pTConfig; sAccount, sIPaddr: string;
  nSessionID: integer; boPayCost: boolean);
procedure SessionDel(Config: pTConfig; nSessionID: integer);
procedure SessionKick(Config: pTConfig; sLoginID: string);
procedure SessionUpdate(Config: pTConfig; nSessionID: integer;
  sServerName: string; boPayCost: boolean);
procedure SessionClearKick(Config: pTConfig);
function IsPayMent(Config: pTConfig; sIPaddr, sAccount: string): boolean;
procedure SessionClearNoPayMent(Config: pTConfig);
function IsLogin(Config: pTConfig; sLoginID: string): boolean; overload;
function IsLogin(Config: pTConfig; nSessionID: integer): boolean; overload;

function GetServerListInfo(): string;
procedure GetSelGateInfo(Config: pTConfig; sServerName, sIPaddr: string;
  var sSelGateIP: string; var nSelGatePort: integer);

function KickUser(Config: pTConfig; UserInfo: pTUserInfo): boolean;
procedure CloseUser(Config: pTConfig; sAccount: string; nSessionID: integer);

procedure AccountCreate(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountChangePassword(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountCheckProtocol(UserInfo: pTUserInfo; nDate: integer);
procedure AccountLogin(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountSelectServer(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountUpdateUserInfo(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountGetBackPassword(UserInfo: pTUserInfo; sData: string);

procedure ReceiveSendUser(Config: pTConfig; sSockIndex: string;
  GateInfo: pTGateInfo; sData: string);
procedure ReceiveOpenUser(Config: pTConfig; sSockIndex: string;
  sIPaddr: string; GateInfo: pTGateInfo);
procedure ReceiveCloseUser(Config: pTConfig; sSockIndex: string; GateInfo: pTGateInfo);

procedure ProcessUserMsg(Config: pTConfig; UserInfo: pTUserInfo; sMsg: string);

procedure DecodeGateData(Config: pTConfig; GateInfo: pTGateInfo);
procedure DecodeUserData(Config: pTConfig; UserInfo: pTUserInfo);
procedure ProcessGate(Config: pTConfig);

procedure LoadAccountCostList(Config: pTConfig; QuickList: TQuickList);
procedure LoadIPaddrCostList(Config: pTConfig; QuickList: TQuickList);

var
  FrmMain: TFrmMain;

implementation

uses
  SQLIDDB, MasSock, FrmFindId, HUtil32, EDcode, GateSet,
  FAccountView, GrobalSession, BasicSet;

{$R *.DFM}

procedure TFrmMain.OpenRouteConfig;
begin
  FrmGateSetting := TFrmGateSetting.Create(nil);
  FrmGateSetting.Open;
  FrmGateSetting.Free;
end;

{
procedure TFrmMain.OpenRouteConfig;
var
  Config  :pTConfig;
begin
  Config:=@g_Config;
  if FrmGateSetting.Open then begin
    LoadAddrTable(Config);
  end;
end;
}
procedure TFrmMain.MENU_OPTION_ROUTEClick(Sender: TObject);
begin
  OpenRouteConfig();
end;

procedure TFrmMain.MENU_VIEW_SESSIONClick(Sender: TObject);
begin
  frmGrobalSession := TfrmGrobalSession.Create(nil);
  frmGrobalSession.Open;
  frmGrobalSession.Free;
end;

procedure TFrmMain.CbViewLogClick(Sender: TObject);
var
  Config: pTConfig;
begin
  Config := @g_Config;
  Config.boShowDetailMsg := CbViewLog.Checked;
end;

//00469778
procedure TFrmMain.GSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  GateInfo: pTGateInfo;
  Config:   pTConfig;
begin
  Config := @g_Config;
  if not ExecTimer.Enabled then begin
    Socket.Close;
    exit;
  end;
  New(GateInfo);
  GateInfo.Socket      := Socket;
  GateInfo.sIPaddr     := GetGatePublicAddr(Config, Socket.RemoteAddress);
  GateInfo.sReceiveMsg := '';
  GateInfo.UserList    := TList.Create;
  GateInfo.dwKeepAliveTick := GetTickCount();
  EnterCriticalSection(Config.GateCriticalSection);
  try
    Config.GateList.Add(GateInfo);
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;
//0x00469898
procedure TFrmMain.GSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  I:      integer;
  II:     integer;
  GateInfo: pTGateInfo;
  UserInfo: pTUserInfo;
  Config: pTConfig;
begin
  Config := @g_Config;
  EnterCriticalSection(Config.GateCriticalSection);
  try
    for I := 0 to Config.GateList.Count - 1 do begin
      GateInfo := Config.GateList.Items[I];
      if GateInfo.Socket = Socket then begin
        for II := 0 to GateInfo.UserList.Count - 1 do begin
          UserInfo := GateInfo.UserList.Items[II];
          if Config.boShowDetailMsg then
            MainOutMessage('Close: ' + UserInfo.sUserIPaddr);
          Dispose(UserInfo);
        end;
        GateInfo.UserList.Free;
        Dispose(GateInfo);
        Config.GateList.Delete(i);
        break;
      end;
    end;
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;

procedure TFrmMain.GSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: integer);
begin
  ErrorCode := 0;
  Socket.Close;
end;
//00469A60
procedure TFrmMain.GSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  I:      integer;
  GateInfo: pTGateInfo;
  Config: pTConfig;
begin
  Config := @g_Config;
  EnterCriticalSection(Config.GateCriticalSection);
  try
    for I := 0 to Config.GateList.Count - 1 do begin
      GateInfo := Config.GateList.Items[I];
      if GateInfo.Socket = Socket then begin
        GateInfo.sReceiveMsg := GateInfo.sReceiveMsg + Socket.ReceiveText;
        break;
      end;
    end;
  finally
    LeaveCriticalSection(Config.GateCriticalSection);
  end;
end;

//0046D19C
procedure LoadAddrTable(Config: pTConfig);
var
  LoadList: TStringList;
  sFileName: string;
  i: integer;
  nRouteIdx: integer;
  nSelGateIdx: integer;
  sLineText, sTitle, sServerName, sGate, sRemote, sPublic, sGatePort: string;
begin
  sFileName := '.\!addrtable.txt';
  LoadList  := TStringList.Create;
  if FileExists(sFileName) then begin
    LoadList.LoadFromFile(sFileName);
    nRouteIdx := 0;
    for i := 0 to LoadList.Count - 1 do begin
      sLineText := LoadList.Strings[i];
      if (sLineText <> '') and (sLineText[1] <> ';') then begin
        sLineText := GetValidStr3(sLineText, sServerName, [' ']);
        sLineText := GetValidStr3(sLineText, sTitle, [' ']);
        sLineText := GetValidStr3(sLineText, sRemote, [' ']);
        sLineText := GetValidStr3(sLineText, sPublic, [' ']);
        sLineText := Trim(sLineText);
        if (sTitle <> '') and (sRemote <> '') and (sPublic <> '') and
          (nRouteIdx < 60) then begin
          Config.GateRoute[nRouteIdx].sServerName := sServerName;
          Config.GateRoute[nRouteIdx].sTitle := sTitle;
          Config.GateRoute[nRouteIdx].sRemoteAddr := sRemote;
          Config.GateRoute[nRouteIdx].sPublicAddr := sPublic;
          nSelGateIdx := 0;
          while (sLineText <> '') do begin
            if nSelGateIdx > 9 then break;
            sLineText := GetValidStr3(sLineText, sGate, [' ']);
            if sGate <> '' then begin
              if sGate[1] = '*' then begin
                sGate := Copy(sGate, 2, length(sGate) - 1);
                Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].boEnable := False;
              end else begin
                Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].boEnable := True;
              end;
              sGatePort := GetValidStr3(sGate, sGate, [':']);
              Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].sIPaddr := sGate;
              Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].nPort :=
                Str_ToInt(sGatePort, 0);
              Config.GateRoute[nRouteIdx].nSelIdx := 0;
              Inc(nSelGateIdx);
            end;//0046D44B
            sLineText := Trim(sLineText);
          end;
          Inc(nRouteIdx);
        end;
      end;
    end;
    Config.nRouteCount := nRouteIdx;
  end;//0046D482
  LoadList.Free;
  GenServerNameList(Config);
end;
//00468F84
procedure TFrmMain.FormCreate(Sender: TObject);
var
  Config: pTConfig;
begin
  Config := @g_Config;

⌨️ 快捷键说明

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