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

📄 main.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  nOPacketIdx, nPacketIdx, nDataLen, n14: Integer;
  DefMsg                                : TDefaultMessage;
begin
  try
    n14 := 0;
    Inc(nProcessMsgSize, Length(UserData.sMsg));
    if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION)
      then
    begin
      if (UserData.nSocketHandle = SessionArray[UserData.nSocketIdx].nSckHandle)
        and
        (SessionArray[UserData.nSocketIdx].nPacketErrCount < 10) then
      begin
        if Length(SessionArray[UserData.nSocketIdx].sSocData) > MSGMAXLENGTH
          then
        begin
          SessionArray[UserData.nSocketIdx].sSocData := '';
          SessionArray[UserData.nSocketIdx].nPacketErrCount := 99;
          UserData.sMsg := '';
        end;                                                //00455F7A
        sMsg := SessionArray[UserData.nSocketIdx].sSocData + UserData.sMsg;
        while (True) do
        begin                                               //00455FA0
          sData := '';
          sMsg := ArrestStringEx(sMsg, '#', '!', sData);
          if Length(sData) > 2 then
          begin
            nPacketIdx := Str_ToInt(sData[1], 99); //将数据名第一位的序号取出
            if SessionArray[UserData.nSocketIdx].nPacketIdx = nPacketIdx then
            begin
              //如果序号重复则增加错误计数
              Inc(SessionArray[UserData.nSocketIdx].nPacketErrCount);
            end
            else
            begin
              nOPacketIdx := SessionArray[UserData.nSocketIdx].nPacketIdx;
              SessionArray[UserData.nSocketIdx].nPacketIdx := nPacketIdx;
              sData := Copy(sData, 2, Length(sData) - 1);
              nDataLen := Length(sData);
              if (nDataLen >= DEFBLOCKSIZE) then
              begin
                if SessionArray[UserData.nSocketIdx].boStartLogon then
                begin
                  //第一个人物登录数据包
                  Inc(nHumLogonMsgSize, Length(sData));
                  SessionArray[UserData.nSocketIdx].boStartLogon := False;
                  sData := '#' + IntToStr(nPacketIdx) + sData + '!';
                  GetMem(Buffer, Length(sData) + 1);
                  Move(sData[1], Buffer^, Length(sData) + 1);
                  SendServerMsg(GM_DATA,
                    UserData.nSocketIdx,
                    SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
                    SessionArray[UserData.nSocketIdx].nUserListIndex,
                    Length(sData) + 1,
                    Buffer);
                  FreeMem(Buffer);
                end
                else
                begin                                       //0045615F
                  //普通数据包
                  Inc(nHumPlayMsgSize, Length(sData));
                  if nDataLen = DEFBLOCKSIZE then
                  begin
                    sDefMsg := sData;
                    sDataMsg := '';
                  end
                  else
                  begin                                     //0045618B
                    sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
                    sDataMsg := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) -
                      DEFBLOCKSIZE);
                  end;                                      //004561BF
                  DefMsg := DecodeMessage(sDefMsg);
                  //检查数据
                  {
                  if not CheckDefMsg(@DefMsg,@SessionArray[UserData.nSocketIdx]) then begin
                    //SessionArray[UserData.nSocketIdx].nPacketIdx:=nOPacketIdx;
                    //sMsg:='#' + IntToStr(nPacketIdx) + sData + '!' + sMsg;
                    Continue;
                  end;
                  }
                  if sDataMsg <> '' then
                  begin
                    if DefMsg.Ident = CM_SAY then
                    begin
                      //控制发言间隔时间
                      //if (GetTickCount - SessionArray[UserData.nSocketIdx].dwSayMsgTick) < dwSayMsgTime then Continue;
                      //SessionArray[UserData.nSocketIdx].dwSayMsgTick:=GetTickCount();

                      sDataText := DecodeString(sDataMsg);
                      if sDataText <> '' then
                      begin
                        if sDataText[1] = '/' then
                        begin
                          sDataText := GetValidStr3(sDataText, sHumName, [' ']);
                          //限制最长可发字符长度
                          //if length(sDataText) > nSayMsgMaxLen then
                          //  sDataText:=Copy(sDataText,1,nSayMsgMaxLen);

                          FilterSayMsg(sDataText);
                          sDataText := sHumName + ' ' + sDataText;
                        end
                        else
                        begin                               //0045623A
                          if sDataText[1] <> '@' then
                          begin
                            //限制最长可发字符长度
                            //if length(sDataText) > nSayMsgMaxLen then
                            //  sDataText:=Copy(sDataText,1,nSayMsgMaxLen);
                            FilterSayMsg(sDataText);
                          end;
                        end;
                      end;
                      if sDataText='' then  Continue;
                        sDataMsg := EncodeString(sDataText);
                    end;                                    //00456255
                    GetMem(Buffer, Length(sDataMsg) + SizeOf(TDefaultMessage) +
                      1);
                    Move(DefMsg, Buffer^, SizeOf(TDefaultMessage));
                    Move(sDataMsg[1], Buffer[SizeOf(TDefaultMessage)],
                      Length(sDataMsg) + 1);
                    SendServerMsg(GM_DATA,
                      UserData.nSocketIdx,
                      SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
                      SessionArray[UserData.nSocketIdx].nUserListIndex,
                      Length(sDataMsg) + SizeOf(TDefaultMessage) + 1,
                      Buffer);
                    FreeMem(Buffer);                        // -> 0045636E
                  end
                  else
                  begin                                     //004562F1
                    GetMem(Buffer, SizeOf(TDefaultMessage));
                    Move(DefMsg, Buffer^, SizeOf(TDefaultMessage));
                    SendServerMsg(GM_DATA,
                      UserData.nSocketIdx,
                      SessionArray[UserData.nSocketIdx].Socket.SocketHandle,
                      SessionArray[UserData.nSocketIdx].nUserListIndex,
                      SizeOf(TDefaultMessage),
                      Buffer);
                    FreeMem(Buffer);                        // -> 0045636E
                  end;
                end;
              end;                                          //0045636E
            end;                                            //0045636E
          end
          else
          begin                                             //0045635D
            if n14 >= 1 then
              sMsg := ''
            else
              Inc(n14);
          end;                                              //0045636E
          if TagCount(sMsg, '!') < 1 then
            break;                                          //00455FA0
        end;
        SessionArray[UserData.nSocketIdx].sSocData := sMsg;
      end
      else
      begin                                                 //0045639C
        SessionArray[UserData.nSocketIdx].sSocData := '';
      end;
    end;                                                    //004563B4

  except
    if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION)
      then
    begin
      sData := '[' + SessionArray[UserData.nSocketIdx].sRemoteAddr + ']';
    end;
    AddMainLogMsg('[Exception] ProcessUserPacket' + sData, 1);
  end;
end;

procedure TFrmMain.ProcessPacket(UserData: pTSendUserData);
//004564E4
var
  sData, sSendBlock                     : string;
  UserSession                           : pTSessionInfo;
begin
  if (UserData.nSocketIdx >= 0) and (UserData.nSocketIdx < GATEMAXSESSION) then
  begin
    UserSession := @SessionArray[UserData.nSocketIdx];
    if UserSession.nSckHandle = UserData.nSocketHandle then
    begin
      Inc(nDeCodeMsgSize, Length(UserData.sMsg));
      sData := UserSession.sSendData + UserData.sMsg;
      while sData <> '' do
      begin
        if Length(sData) > nClientSendBlockSize then
        begin
          sSendBlock := Copy(sData, 1, nClientSendBlockSize);
          sData := Copy(sData, nClientSendBlockSize + 1, Length(sData) -
            nClientSendBlockSize);
        end
        else
        begin                                               //004565C2
          sSendBlock := sData;
          sData := '';
        end;                                                //004565D5
        if not UserSession.boSendAvailable then
        begin
          if GetTickCount > UserSession.dwTimeOutTime then
          begin
            UserSession.boSendAvailable := True;
            UserSession.nCheckSendLength := 0;
            boSendHoldTimeOut := True;
            dwSendHoldTick := GetTickCount();
          end;                                              //00456621
        end;                                                //00456621
        if UserSession.boSendAvailable then
        begin
          if UserSession.nCheckSendLength >= SENDCHECKSIZE then
          begin
            if not UserSession.boSendCheck then
            begin
              UserSession.boSendCheck := True;
              sSendBlock := '*' + sSendBlock;
            end;                                            //0045665A
            if UserSession.nCheckSendLength >= SENDCHECKSIZEMAX then
            begin
              UserSession.boSendAvailable := False;
              UserSession.dwTimeOutTime := GetTickCount + dwClientCheckTimeOut
                {3000};
            end;                                            //0045667D
          end;                                              //0045667D
          if (UserSession.Socket <> nil) and (UserSession.Socket.Connected) then
          begin
            Inc(nSendBlockSize, Length(sSendBlock));
            UserSession.Socket.SendText(sSendBlock);
          end;                                              //004566AE
          Inc(UserSession.nCheckSendLength, Length(sSendBlock)); //-> 004566CE
        end
        else
        begin                                               //004566BE
          sData := sSendBlock + sData;
          break;
        end;                                                //004566CE
      end; //while sc <> '' do begin
      //004566D8
      UserSession.sSendData := sData;
    end;                                                    //004566F3
  end;                                                      //004566F3
end;

procedure TFrmMain.FilterSayMsg(var sMsg: string);
var
  i, nLen                               : Integer;
  sReplaceText                          : string;
  sFilterText                           : string;
begin


  try
    CS_FilterMsg.Enter;
    for i := 0 to AbuseList.Count - 1 do
    begin
      sFilterText := AbuseList.Strings[i];
      sReplaceText := '';
      if AnsiContainsText(sMsg, sFilterText) then
      begin
       { for nLen := 1 to Length(sFilterText) do
        begin
          sReplaceText := sReplaceText + sReplaceWord;
        end;
        sMsg := AnsiReplaceText(sMsg, sFilterText, sReplaceText);
        }
        sMsg:='';
      end;
    end;
  finally
    CS_FilterMsg.Leave;
  end;
end;

procedure TFrmMain.ClientSocketError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
//00454E0C
begin
  ErrorCode := 0;
  Socket.Close;
  boServerReady := False;
end;

procedure TFrmMain.MENU_CONTROL_EXITClick(Sender: TObject);
begin
  Close;
end;

procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if boClose then
    exit;

  //  if MessageDlg('是否确认退出服务器?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  if Application.MessageBox('是否确认退出服务器?',
    '确认信息',
    MB_YESNO + MB_ICONQUESTION) = IDYES then
  begin
    if boServiceStart then
    begin
      StartTimer.Enabled := True;
      CanClose := False;
    end;
  end
  else
    CanClose := False;

end;

procedure TFrmMain.MENU_CONTROL_STARTClick(Sender: TObject);
begin
  StartService();
end;

procedure TFrmMain.StartService;
begin
  try

    AddMainLogMsg('正在启动服务...', 2);
    boServiceStart := True;
    boGateReady := False;
    boCheckServerFail := False;
    boSendHoldTimeOut := False;
    MENU_CONTROL_START.Enabled := False;
    POPMENU_START.Enabled := False;
    POPMENU_CONNSTOP.Enabled := True;
    MENU_CONTROL_STOP.Enabled := True;
    SessionCount := 0;
    LoadConfig();
    Caption := GateName + ' - ' + TitleName;
    RestSessionArray();
    dwProcessReviceMsgTimeLimit := 50;
    dwProcessSendMsgTimeLimit := 50;

    boServerReady := False;
    dwReConnectServerTime := GetTickCount - 25000;          //0045498C
    dwRefConsolMsgTick := GetTickCount();
    dwCheckServerTick:=GetTickCount();
    ServerSocket.Active := False;
    ServerSocket.Address := GateAddr;
    ServerSocket.Port := GatePort;
    ServerSocket.Active := True;

    ClientSocket.Active := False;
    ClientSocket.Address := ServerAddr;
    ClientSocket.Port := ServerPort;
    ClientSocket.Active := True;

    SendTimer.Enabled := True;
    AddMainLogMsg('服务已启动成功...', 2);
  except
    on E: Exception do
    begin
      MENU_CONTROL_START.Enabled := True;
      MENU_CONTROL_STOP.Enabled := False;
      POPMENU_START.Enabled := True;
      POPMENU_CONNSTOP.Enabled := False;
      AddMainLogMsg(E.Message, 0);
    end;
  end;
end;

procedure TFrmMain.StopService;
var
  nSockIdx                              : Integer;
begin
  AddMainLogMsg('正在停止服务...', 2);
  boServiceStart := False;
  boGateReady := False;
  MENU_CONTROL_START.Enabled := True;
  MENU_CONTROL_STOP.Enabled := False;
  POPMENU_START.Enabled := True;
  POPMENU_CONNSTOP.Enabled := False;
  for nSockIdx := 0 to GATEMAXSESSION - 1 do
  begin
    if SessionArray[nSockIdx].Socket <> nil then
      SessionArray[nSockIdx].Socket.Close;
  end;
  ServerSocket.Close;
  ClientSocket.Close;
  AddMainLogMsg('服务停止成功...', 2);
end;

procedure TFrmMain.MENU_CONTROL_STOPClick(Sender: TObject);
begin
  if Application.MessageBox('是否确认停止服务?',
    '确认信息',
    MB_YESNO + MB_ICONQUESTION) = IDYES then
    StopService();
end;

procedure TFrmMain.LoadConfig;
begin
  AddMainLogMsg('正在加载配置信息...', 3);
  if Conf <> nil then
  begin
    TitleName := Conf.ReadString(GateClass, 'Title', TitleName);
    ServerAddr := Conf.ReadString(GateClass, 'ServerAddr', ServerAddr);
    ServerPort := Conf.ReadInteger(GateClass, 'ServerPort', ServerPort);
    GateAddr := Conf.ReadString(GateClass, 'GateAddr', GateAddr);
    GatePort := Conf.ReadInteger(GateClass, 'GatePort', GatePort);
    nShowLogLevel := Conf.ReadInteger(GateClass, 'ShowLogLevel', nShowLogLevel);
    boShowBite := Conf.ReadBool(GateClass, 'ShowBite', boShowBite);

    nMaxConnOfIPaddr := Conf.ReadInteger(GateClass, 'MaxConnOfIPaddr',
      nMaxConnOfIPaddr);
    BlockMethod := TBlockIPMethod(Conf.ReadInteger(GateClass, 'BlockMethod',
      Integer(BlockMethod)));

    nMaxClientPacketSize := Conf.ReadInteger(GateClass, 'MaxClientPacketSize',
      nMaxClientPacketSize);
    nNomClientPacketSize := Conf.ReadInteger(GateClass, 'NomClientPacketSize',
      nNomClientPacketSize);
    nMaxClientMsgCount := Conf.ReadInteger(GateClass, 'MaxClientMsgCount',
      nMaxClientMsgCount);
    bokickOverPacketSize := Conf.ReadBool(GateClass, 'kickOverPacket',
      bokickOverPacketSize);

    dwCheckServerTimeOutTime := Conf.ReadInteger(GateClass,
      'ServerCheckTimeOut', dwCheckServerTimeOutTime);
    nClientSendBlockSize := Conf.ReadInteger(GateClass, 'ClientSendBlockSize',
      nClientSendBlockSize);
    dwClientTimeOutTime := Conf.ReadInteger(GateClass, 'ClientTimeOutTime',
      dwClientTimeOutTime);
    dwSessionTimeOutTime := Conf.ReadInteger(GateClass, 'SessionTimeOutTime',
      dwSessionTimeOutTime);
    nSayMsgMaxLen := Conf.ReadInteger(GateClass, 'SayMsgMaxLen', nSayMsgMaxLen);
    dwSayMsgTime := Conf.ReadInteger(GateClass, 'SayMsgTime', dwSayMsgTime);
  end;
  AddMainLogMsg('配置信息加载完成...', 3);
  LoadAbuseFile();
  LoadBlockIPFile();
end;

⌨️ 快捷键说明

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