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

📄 usrsoc.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit UsrSoc;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, SyncObjs, IniFiles, Grobal2,
  DBShare,StrUtils,mylist,
  D7ScktComp;
type


  TFrmUserSoc = class(TForm)
    UserSocket: TServerSocket;
    Timer1: TTimer;
    ClientSocket1: TClientSocket;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure UserSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure UserSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure UserSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure UserSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Timer2Timer(Sender: TObject);
  private
    dwKeepAliveTick: LongWord;                              //0x10
    CS_GateSession: TCriticalSection;                       //0x2D8
    n2DC: Integer;
    n2E0: Integer;
    n2E4: Integer;
    GateList:Array[0..9] of TGateinfo;                                    //0x2E8
    CurGate: integer;                                    //0x51C

    sDBReciveText:string;
    function LoadChrNameList(sFileName: string): Boolean;

    procedure ProcessGateMsg(GateIndex:Integer);
    procedure SendKeepAlivePacket(Socket: TCustomWinSocket);
    procedure ProcessUserMsg(var UserInfo: TUserInfo);
    procedure CloseUser(sID: string; GateIndex:Integer);
    procedure OpenUser(sID, sIP: string; GateIndex:Integer);
    procedure DeCodeUserMsg(sData: string; var UserInfo: TUserInfo);
    function  QueryChr(sData: string; var UserInfo: TUserInfo): Boolean;
    procedure DelChr(sData: string; var UserInfo: TUserInfo);
    procedure OutOfConnect(const UserInfo: TUserInfo);
    procedure newchr(sData: string; var UserInfo: TUserInfo);
    function  SelectChr(sData: string; var UserInfo: TUserInfo): Boolean;
    procedure SendUserSocket(Socket: TCustomWinSocket; sSessionID,sSendMsg: string);


    function GateRoutePort(sGateIP: string): Integer;
    function CheckDenyChrName(sChrName: string): Boolean;
    { Private declarations }
  public
    function GateRouteIP(sGateIP: string; var nPort: Integer): string;
    procedure LoadServerInfo();

    function GetUserCount(): Integer;
    function GetDBSockMsg(var Msg:TDefaultMessage;TimeOut:LongWord):Boolean;
    function SendDBSockMsg(sMsg:String):Boolean;
    function CheckGuildName(GuildName:String):Boolean;
    { Public declarations }
  end;

var
  FrmUserSoc                            : TFrmUserSoc;
  ShowErrorMsg                          : Boolean;

implementation

uses  HUtil32, IDSocCli, EDcode, MudUtil, DBSMain,
  DataSQL_DB;

{$R *.DFM}

procedure TFrmUserSoc.UserSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
//0x004A2A10
var
  sIPaddr                               : string;
  i ,ii                                 : Integer;
  Find                                  : Boolean;
begin
  sIPaddr := Socket.RemoteAddress;
  if not CheckServerIP(sIPaddr) then
  begin
    OutMainMessage('非法网关连接: ' + sIPaddr);
    Socket.Close;
    exit;
  end;


  Find:=False;

  if not boOpenDBBusy then
  begin

     for i:=0 to 9 do
     Begin
        if not GateList[i].IsUsed then
        Begin
          Socket.nIndex:=i;
          GateList[i].Socket := Socket;
          GateList[i].sGateaddr := sIPaddr;
          GateList[i].sText := '';

          GateList[i].dwTick10 := GetTickCount();
          GateList[i].nGateID := GetGateID(sIPaddr);
          for ii:=0 to UserCount do
          Begin
            GateList[i].UserList[ii].IsUsered:=False;
            GateList[i].Count:=0;
          End;
          GateList[i].IsUsed:=True;
          Find:=True;
          Break;
        End;
     End;
     if not Find then
        Socket.Close;
  end
  else
  begin
    Socket.Close;
  end;
end;

procedure TFrmUserSoc.UserSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
//0x004A2B08
var
  i, ii                                 : Integer;


begin
  try
    CS_GateSession.Enter;

    if Socket.nIndex in [0..9] then
    Begin
       GateList[socket.nIndex].IsUsed:=False;
       GateList[socket.nIndex].Socket:=nil;
       GateList[socket.nIndex].sText:='';
       GateList[socket.nIndex].sReceiveText:='';
       GateList[socket.nIndex].Count:=0;
    End;

  finally
    CS_GateSession.Leave;
  end;
end;

procedure TFrmUserSoc.UserSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
//0x004A2C10
begin
  ErrorCode := 0;
  Socket.Close;
end;

procedure TFrmUserSoc.UserSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i                                     : Integer;
  sReviceMsg                            : string;
  GateIndex                             : Integer;
begin
  try
    CS_GateSession.Enter;
    GateIndex:=Socket.nIndex;
    if   GateIndex in [0..9] then
       GateList[GateIndex].sReceiveText:=GateList[GateIndex].sReceiveText+Socket.ReceiveText;
  finally
    CS_GateSession.Leave;
  end;
end;

procedure TFrmUserSoc.FormCreate(Sender: TObject);
var
  i  : Integer;
//0x004A2898
begin
  CS_GateSession := TCriticalSection.Create;

  for i:=0 to 9 do
  Begin
     GateList[i].IsUsed:=False;
     GateList[i].Socket:=nil;
  End;

  UserSocket.Port := g_nGatePort;
  UserSocket.Address := g_sGateAddr;
  UserSocket.Active := True;
   ShowErrorMsg :=False;
  ClientSocket1.Port:=g_nRemotPort;
  
  ClientSocket1.Active:=True;
  LoadServerInfo();
  LoadChrNameList('DenyChrName.txt');
 
end;

procedure TFrmUserSoc.FormDestroy(Sender: TObject);
 
var
  i                                     : Integer;
begin
  CS_GateSession.Free;
end;

procedure TFrmUserSoc.Timer1Timer(Sender: TObject);
//0x004A4EFC
var
  n8                                    : Integer;
begin
 { n8 := g_nQueryChrCount + nHackerNewChrCount + nHackerDelChrCount +
    nHackerSelChrCount + n4ADC1C + n4ADC20 + n4ADC24 + n4ADC28;
  if n4ADBB8 <> n8 then
  begin
    n4ADBB8 := n8;
    OutMainMessage('H-QyChr=' + IntToStr(g_nQueryChrCount) + ' ' +
      'H-NwChr=' + IntToStr(nHackerNewChrCount) + ' ' +
      'H-DlChr=' + IntToStr(nHackerDelChrCount) + ' ' +
      'Dubl-Sl=' + IntToStr(nHackerSelChrCount) + ' ' +
      'H-Er-P1=' + IntToStr(n4ADC1C) + ' ' +
      'Dubl-P2=' + IntToStr(n4ADC20) + ' ' +
      'Dubl-P3=' + IntToStr(n4ADC24) + ' ' +
      'Dubl-P4=' + IntToStr(n4ADC28));
  end;
  }
  if not ClientSocket1.Active then
      ClientSocket1.Active:=True;
end;

function TFrmUserSoc.GetUserCount(): Integer;
var
  i                                     : Integer;

  nUserCount                            : Integer;
begin
  nUserCount := 0;
  try
    CS_GateSession.Enter;
    for i := 0 to 9 do
    begin

      if GateList[i].IsUsed then
        Inc(nUserCount, GateList[i].Count);
    end;
  finally
    CS_GateSession.Leave;
  end;
  Result := nUserCount;
end;





procedure TFrmUserSoc.LoadServerInfo;
//0x004A2018
var
  i                                     : Integer;
  LoadList                              : TStringList;
  nRouteIdx, nGateIdx      : Integer;
  sLineText, sSelGateIPaddr, sGameGateIPaddr, sGameGate, sGameGatePort:string;

begin
  try
    LoadList := TStringList.Create;
    FillChar(g_RouteInfo, SizeOf(g_RouteInfo), #0);
    LoadList.LoadFromFile(sGateConfFileName);
    nRouteIdx := 0;
    nGateIdx := 0;
    for i := 0 to LoadList.Count - 1 do
    begin
      sLineText := Trim(LoadList.Strings[i]);
      if (sLineText <> '') and (sLineText[1] <> ';') then
      begin
        sGameGate := GetValidStr3(sLineText, sSelGateIPaddr, [' ', #9]);
        if (sGameGate = '') or (sSelGateIPaddr = '') then
          Continue;
        g_RouteInfo[nRouteIdx].sSelGateIP := Trim(sSelGateIPaddr);
        g_RouteInfo[nRouteIdx].nGateCount := 0;
        nGateIdx := 0;
        while (sGameGate <> '') do
        begin
          sGameGate := GetValidStr3(sGameGate, sGameGateIPaddr, [' ', #9]);
          sGameGate := GetValidStr3(sGameGate, sGameGatePort, [' ', #9]);
          g_RouteInfo[nRouteIdx].sGameGateIP[nGateIdx] := Trim(sGameGateIPaddr);
          g_RouteInfo[nRouteIdx].nGameGatePort[nGateIdx] :=
            Str_ToInt(sGameGatePort, 0);
          Inc(nGateIdx);
        end;
        g_RouteInfo[nRouteIdx].nGateCount := nGateIdx;
        Inc(nRouteIdx);
      end;
    end;



  finally
  end;
end;









function TFrmUserSoc.LoadChrNameList(sFileName: string): Boolean;
//0x0045C1A0
var
  i                                     : Integer;
begin
  Result := False;
  if FileExists(sFileName) then
  begin
    DenyChrNameList.LoadFromFile(sFileName);
    i := 0;
    while (True) do
    begin
      if DenyChrNameList.Count <= i then
        break;
      if Trim(DenyChrNameList.Strings[i]) = '' then
      begin
        DenyChrNameList.Delete(i);
        Continue;
      end;
      Inc(i);
    end;
    Result := True;
  end;


end;


procedure TFrmUserSoc.ProcessGateMsg(GateIndex:Integer);
//0x004A3350
var
  s0C                                   : string;
  s10                                   : string;
  ss                                    : string;
  s19                                   : Char;
  i                                     : Integer;

  UserInfo                              : TUserInfo;
  len                                   : array[0..0] of LongWord;

begin

  
  if not (GateIndex in [0..9]) then exit;

  while (GateList[GateIndex].IsUsed)and(GateList[GateIndex].sText <> '') do

⌨️ 快捷键说明

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