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

📄 main.pas

📁 传奇服务端代码 RunGate.rar 通讯代码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
var
  sMsg,sData,sDefMsg,sDataMsg,sDataText,sHumName:String;
  Buffer:PChar;
  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;//0045624A
                        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
  if sMsg = 'OoOoOoOoOoQ' then begin
    //CloseAllUser();
  end;
    
  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);
      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 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();
    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;
var
  ini: TMemIniFile;
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);

    PosFile := Conf.ReadString('Setup','Positions','.\Positions.ini');

    ini := TMemIniFile.Create(PosFile);
    frmMain.Left := ini.ReadInteger('GameGate','Left',(Screen.Width Div 2)-(frmMain.Width Div 2));
    frmMain.Top := ini.ReadInteger('GameGate','Top',(Screen.Height Div 2)-(frmMain.Height Div 2)-30);
    ini.Free;
  end;
  AddMainLogMsg('设置文件已加载...',3);
  LoadAbuseFile();
  LoadBlockIPFile();
end;

procedure TFrmMain.ShowMainLogMsg;
var
  i:Integer;
begin
  if (GetTickCount - dwShowMainLogTick) < 200 then exit;
  dwShowMainLogTick:=GetTickCount();
  try
    boShowLocked:=True;
    try

⌨️ 快捷键说明

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