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

📄 massock.pas

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

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, D7ScktComp;
type
  TMsgServerInfo = record
    sReceiveMsg: string;
    Socket: TCustomWinSocket;
    sServerName: string;                                    //0x08
    nServerIndex: Integer;                                  //0x0C
    nOnlineCount: Integer;                                  //0x10
    dwKeepAliveTick: LongWord;                              //0x14
    sIPaddr: string;
  end;
  pTMsgServerInfo = ^TMsgServerInfo;
  TLimitServerUserInfo = record
    sServerName: string;
    sName: string;
    nLimitCountMin: Integer;
    nLimitCountMax: Integer;
  end;
  pTLimitServerUserInfo = ^TLimitServerUserInfo;
  TFrmMasSoc = class(TForm)
    MSocket: TServerSocket;

    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure MSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure MSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure MSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure MSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    procedure SortServerList(nIndex: Integer);
    procedure RefServerLimit(sServerName: string);
    function LimitName(sServerName: string): string;
    procedure LoadUserLimit;
    { Private declarations }
  public
    m_ServerList: TList;
    procedure LoadServerAddr();
    function CheckReadyServers(): Boolean;
    procedure SendServerMsg(wIdent: Word; sServerName, sMsg: string);
    procedure SendServerMsgA(wIdent: Word; sMsg: string);
    function IsNotUserFull(sServerName: string): Boolean;
    function ServerStatus(sServerName: string): Integer;
    function GetOnlineHumCount(): Integer;
    { Public declarations }
  end;

var
  FrmMasSoc                             : TFrmMasSoc;
  nUserLimit                            : Integer;
  UserLimit                             : array[0..99] of TLimitServerUserInfo;

implementation

uses LSShare, LMain, HUtil32, Grobal2;

{$R *.DFM}
//00465934

procedure TFrmMasSoc.FormCreate(Sender: TObject);
var
  Config                                : pTConfig;
begin
  Config := @g_Config;
  m_ServerList := TList.Create;
  MSocket.Address := Config.sServerAddr;
  MSocket.Port := Config.nServerPort;
  MSocket.Active := true;
  LoadServerAddr();
  LoadUserLimit();
end;
//00465B08

procedure TFrmMasSoc.MSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I                                     : Integer;
  sRemoteAddr                           : string;
  boAllowed                             : Boolean;
  MsgServer                             : pTMsgServerInfo;
begin
  sRemoteAddr := Socket.RemoteAddress;
  boAllowed := False;
  for I := Low(ServerAddr) to High(ServerAddr) do
    if sRemoteAddr = ServerAddr[I] then
    begin
      boAllowed := true;
      break;
    end;
  if boAllowed then
  begin
    New(MsgServer);
    FillChar(MsgServer^, SizeOf(TMsgServerInfo), #0);
    MsgServer.sReceiveMsg := '';
    MsgServer.Socket := Socket;
    m_ServerList.Add(MsgServer);
  end
  else
  begin
    MainOutMessage('非法地址连接:' + sRemoteAddr);
    Socket.Close;
  end;
end;
//00465C54

procedure TFrmMasSoc.MSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I                                     : Integer;
  MsgServer                             : pTMsgServerInfo;
begin
  for I := 0 to m_ServerList.Count - 1 do
  begin
    MsgServer := m_ServerList.Items[I];
    if MsgServer.Socket = Socket then
    begin
      Dispose(MsgServer);
      m_ServerList.Delete(I);
      break;
    end;
  end;
end;

procedure TFrmMasSoc.MSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ErrorCode := 0;
  Socket.Close;
end;
//0046611C

procedure TFrmMasSoc.MSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  I                                     : Integer;
  MsgServer                             : pTMsgServerInfo;
  sReviceMsg                            : string;
  sMsg                                  : string;
  sCode                                 : string;
  sAccount                              : string;
  sServerName                           : string;
  sIndex                                : string;
  sOnlineCount                          : string;
  nCode                                 : Integer;
  Config                                : pTConfig;
begin
  Config := @g_Config;
  for I := 0 to m_ServerList.Count - 1 do
  begin
    MsgServer := m_ServerList.Items[I];
    if MsgServer.Socket = Socket then
    begin
      sReviceMsg := MsgServer.sReceiveMsg + Socket.ReceiveText;
      while (Pos(')', sReviceMsg) > 0) do
      begin
        sReviceMsg := ArrestStringEx(sReviceMsg, '(', ')', sMsg);
        if sMsg = '' then
          break;
        sMsg := GetValidStr3(sMsg, sCode, ['/']);
        nCode := Str_ToInt(sCode, -1);
        case nCode of
          SS_SOFTOUTSESSION:
            begin
              sMsg := GetValidStr3(sMsg, sAccount, ['/']);
              CloseUser(Config, sAccount, Str_ToInt(sMsg, 0));
            end;
          SS_SERVERINFO:
            begin
              sMsg := GetValidStr3(sMsg, sServerName, ['/']);
              sMsg := GetValidStr3(sMsg, sIndex, ['/']);
              sMsg := GetValidStr3(sMsg, sOnlineCount, ['/']);
              MsgServer.sServerName := sServerName;
              MsgServer.nServerIndex := Str_ToInt(sIndex, 0);
              MsgServer.nOnlineCount := Str_ToInt(sOnlineCount, 0);
              MsgServer.dwKeepAliveTick := GetTickCount();
              SortServerList(I);
              nOnlineCountMin := GetOnlineHumCount();
              if nOnlineCountMin > nOnlineCountMax then
                nOnlineCountMax := nOnlineCountMin;
              SendServerMsgA(SS_KEEPALIVE, IntToStr(nOnlineCountMin));
              RefServerLimit(sServerName);
            end;
          UNKNOWMSG: SendServerMsgA(UNKNOWMSG, sMsg);
        end;
      end;
    end;
    MsgServer.sReceiveMsg := sReviceMsg;
  end;
end;

procedure TFrmMasSoc.FormDestroy(Sender: TObject);
begin
  m_ServerList.Free;
end;

//00465CF8

procedure TFrmMasSoc.RefServerLimit(sServerName: string);
var
  I                                     : Integer;
  nCount                                : Integer;
  MsgServer                             : pTMsgServerInfo;
begin
  try
    nCount := 0;
    for I := 0 to m_ServerList.Count - 1 do
    begin
      MsgServer := m_ServerList.Items[I];
      if (MsgServer.nServerIndex <> 99) and (MsgServer.sServerName = sServerName)
        then
        Inc(nCount, MsgServer.nOnlineCount);
    end;
    for I := Low(UserLimit) to High(UserLimit) do
    begin
      if UserLimit[I].sServerName = sServerName then
      begin
        UserLimit[I].nLimitCountMin := nCount;
        break;
      end;
    end;
  except
    MainOutMessage('TFrmMasSoc.RefServerLimit');
  end;
end;


//00465E78

function TFrmMasSoc.IsNotUserFull(sServerName: string): Boolean;
var
  I                                     : Integer;
begin
  Result := true;
  for I := Low(UserLimit) to High(UserLimit) do
  begin
    if UserLimit[I].sServerName = sServerName then
    begin
      if UserLimit[I].nLimitCountMin > UserLimit[I].nLimitCountMax then
        Result := False;
      break;
    end;
  end;
end;
//00465F18

procedure TFrmMasSoc.SortServerList(nIndex: Integer);
var
  nC, n10, n14                          : Integer;
  MsgServerSort                         : pTMsgServerInfo;
  MsgServer                             : pTMsgServerInfo;
  nNewIndex                             : Integer;
begin
  try
    if m_ServerList.Count <= nIndex then
      exit;
    MsgServerSort := m_ServerList.Items[nIndex];
    m_ServerList.Delete(nIndex);
    for nC := 0 to m_ServerList.Count - 1 do
    begin
      MsgServer := m_ServerList.Items[nC];
      if MsgServer.sServerName = MsgServerSort.sServerName then
      begin
        if MsgServer.nServerIndex < MsgServerSort.nServerIndex then
        begin
          m_ServerList.Insert(nC, MsgServerSort);
          exit;
        end
        else
        begin                                               //00465FD8
          nNewIndex := nC + 1;
          if nNewIndex < m_ServerList.Count then

⌨️ 快捷键说明

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