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

📄 main.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  begin
    UserSession := @SessionArray[i];
    if UserSession.Socket <> nil then
    begin
      UserSession.Socket.Close;
      UserSession.Socket := nil;
      UserSession.nSckHandle := -1;
    end;
  end;
  RestSessionArray();
  if SocketBuffer <> nil then
  begin
    FreeMem(SocketBuffer);
  end;
  SocketBuffer := nil;

  for i := 0 to List_45AA58.Count - 1 do
  begin
    //00454D6F
    //00454D95
  end;
  List_45AA58.Clear;
  boGateReady := False;
  boServerReady := False;

end;

procedure TFrmMain.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  dwTime10, dwTick14                    : LongWord;
  nMsgLen                               : Integer;
  tBuffer                               : PChar;
begin
  try
    dwTick14 := GetTickCount();
    nMsgLen := Socket.ReceiveLength;
    GetMem(tBuffer, nMsgLen);
    Socket.ReceiveBuf(tBuffer^, nMsgLen);
    ProcReceiveBuffer(tBuffer, nMsgLen);
    Inc(nBufferOfM2Size, nMsgLen);
    dwTime10 := GetTickCount - dwTick14;
    if dwProcessServerMsgTime < dwTime10 then
    begin
      dwProcessServerMsgTime := dwTime10;
    end;
  except
    on E: Exception do
    begin
      AddMainLogMsg('[Exception] ClientSocketRead', 1);
    end;
  end;
end;

procedure TFrmMain.ProcReceiveBuffer(tBuffer: PChar; nMsgLen: Integer);
var
  nLen                                  : Integer;
  Buff                                  : PChar;
  pMsg                                  : pTMsgHeader;
  MsgBuff                               : PChar;
  TempBuff                              : PChar;
begin
  try
    ReallocMem(SocketBuffer, nBuffLen + nMsgLen);
    Move(tBuffer^, SocketBuffer[nBuffLen], nMsgLen);
    FreeMem(tBuffer);
    nLen := nBuffLen + nMsgLen;
    Buff := SocketBuffer;
    if nLen >= SizeOf(TMsgHeader) then
    begin
      while (True) do
      begin
        pMsg := pTMsgHeader(Buff);
        if pMsg.dwCode = RUNGATECODE then
        begin
          if (abs(pMsg.nLength) + SizeOf(TMsgHeader)) > nLen then
            break;                                          // -> 0045525C
          MsgBuff := Ptr(LongInt(Buff) + SizeOf(TMsgHeader));
          case pMsg.wIdent of
            GM_CHECKSERVER:
              begin
                boCheckServerFail := False;
                dwCheckServerTick := GetTickCount();
              end;
            GM_SERVERUSERINDEX:
              begin
                if (pMsg.wGSocketIdx < GATEMAXSESSION) and (pMsg.nSocket =
                  SessionArray[pMsg.wGSocketIdx].nSckHandle) then
                begin
                  SessionArray[pMsg.wGSocketIdx].nUserListIndex :=
                    pMsg.wUserListIndex;
                end;                                        //00455218
              end;
            GM_RECEIVE_OK:
              begin
                dwCheckServerTimeMin := GetTickCount - dwCheckRecviceTick;
                if dwCheckServerTimeMin > dwCheckServerTimeMax then
                  dwCheckServerTimeMax := dwCheckServerTimeMin;
                dwCheckRecviceTick := GetTickCount();
                SendServerMsg(GM_RECEIVE_OK, 0, 0, 0, 0, nil);
              end;
            GM_DATA:
              begin
                ProcessMakeSocketStr(pMsg.nSocket, pMsg.wGSocketIdx, MsgBuff,
                  pMsg.nLength);
              end;
            GM_TEST:
              begin

              end;
          end;
          Buff := @Buff[SizeOf(TMsgHeader) + abs(pMsg.nLength)];
          //Buff:=Ptr(LongInt(Buff) + (abs(pMsg.nLength) + SizeOf(TMsgHeader)));
          nLen := nLen - (abs(pMsg.nLength) + SizeOf(TMsgHeader));
        end
        else
        begin                                               //00455242
          Inc(Buff);
          Dec(nLen);
          //0045524C                 inc     ds:dword_46950C
        end;
        if nLen < SizeOf(TMsgHeader) then
          break;
      end;
    end;                                                    //0045525C

    if nLen > 0 then
    begin
      GetMem(TempBuff, nLen);
      Move(Buff^, TempBuff^, nLen);
      FreeMem(SocketBuffer);
      SocketBuffer := TempBuff;
      nBuffLen := nLen;
    end
    else
    begin                                                   //00455297
      FreeMem(SocketBuffer);
      SocketBuffer := nil;
      nBuffLen := 0;
    end;

  except
    on E: Exception do
    begin
      AddMainLogMsg('[Exception] ProcReceiveBuffer', 1);
    end;
  end;
end;

procedure TFrmMain.ProcessMakeSocketStr(nSocket, nSocketIndex: Integer; Buffer:
  PChar; nMsgLen: Integer);
//00455CA8
var
  sSendMsg                              : string;
  pDefMsg                               : pTDefaultMessage;
  UserData                              : pTSendUserData;
begin
  try
    sSendMsg := '';
    if nMsgLen < 0 then
    begin
      sSendMsg := '#' + string(Buffer) + '!';
    end
    else
    begin                                                   //00455D18
      if (nMsgLen >= SizeOf(TDefaultMessage)) then
      begin
        pDefMsg := pTDefaultMessage(Buffer);
        if nMsgLen > SizeOf(TDefaultMessage) then
        begin
          sSendMsg := '#' + EncodeMessage(pDefMsg^) +
            string(PChar(@Buffer[SizeOf(TDefaultMessage)])) + '!';
        end
        else
        begin                                               //00455D62
          sSendMsg := '#' + EncodeMessage(pDefMsg^) + '!';
        end;
      end;                                                  //00455D87
    end;
    if (nSocketIndex >= 0) and (nSocketIndex < GATEMAXSESSION) and (sSendMsg <>
      '') then
    begin
      New(UserData);
      UserData.nSocketIdx := nSocketIndex;
      UserData.nSocketHandle := nSocket;
      UserData.sMsg := sSendMsg;
      SendMsgList.Add(UserData);
    end;
  except
    on E: Exception do
    begin
      AddMainLogMsg('[Exception] ProcessMakeSocketStr', 1);
    end;
  end;
end;

procedure TFrmMain.MENU_CONTROL_CLEAELOGClick(Sender: TObject);
begin
  if Application.MessageBox('是否确认清除显示的日志信息?',
    '确认信息',
    MB_OKCANCEL + MB_ICONQUESTION
    ) <> IDOK then
    exit;
  MemoLog.Clear;
end;

procedure TFrmMain.MENU_CONTROL_RECONNECTClick(Sender: TObject);
begin
  dwReConnectServerTime := 0;
end;

procedure TFrmMain.MENU_OPTION_GENERALClick(Sender: TObject);
begin
  frmGeneralConfig.Top := Self.Top + 20;
  frmGeneralConfig.Left := Self.Left;
  with frmGeneralConfig do
  begin
    EditGateIPaddr.Text := GateAddr;
    EditGatePort.Text := IntToStr(GatePort);
    EditServerIPaddr.Text := ServerAddr;
    EditServerPort.Text := IntToStr(ServerPort);
    EditTitle.Text := TitleName;
    TrackBarLogLevel.Position := nShowLogLevel;
    ComboBoxShowBite.ItemIndex := Integer(boShowBite);
  end;
  frmGeneralConfig.ShowModal;
end;

procedure TFrmMain.MENU_OPTION_FILTERMSGClick(Sender: TObject);
var
  i                                     : Integer;
begin
  frmMessageFilterConfig.Top := Self.Top + 20;
  frmMessageFilterConfig.Left := Self.Left;
  frmMessageFilterConfig.ListBoxFilterText.Clear;
  try
    CS_FilterMsg.Enter;
    for i := 0 to AbuseList.Count - 1 do
    begin
      frmMessageFilterConfig.ListBoxFilterText.Items.Add(AbuseList.Strings[i]);
    end;
  finally
    CS_FilterMsg.Leave;
  end;
  frmMessageFilterConfig.ButtonDel.Enabled := False;
  frmMessageFilterConfig.ButtonMod.Enabled := False;
  frmMessageFilterConfig.ShowModal;
end;

function TFrmMain.IsBlockIP(sIPaddr: string): Boolean;
var
  i                                     : Integer;
  sBlockIPaddr                          : string;
begin
  Result := False;
  for i := 0 to TempBlockIPList.Count - 1 do
  begin
    sBlockIPaddr := TempBlockIPList.Strings[i];
    if CompareText(sIPaddr, sBlockIPaddr) = 0 then
    begin
      Result := True;
      break;
    end;
  end;
  for i := 0 to BlockIPList.Count - 1 do
  begin
    sBlockIPaddr := BlockIPList.Strings[i];
    if CompareLStr(sIPaddr, sBlockIPaddr, Length(sBlockIPaddr)) then
    begin
      Result := True;
      break;
    end;
  end;
end;

function TFrmMain.IsConnLimited(sIPaddr: string): Boolean;
var
  i, nCount                             : Integer;
begin
  nCount := 0;
  Result := False;
  for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
  begin
    if CompareText(sIPaddr, ServerSocket.Socket.Connections[i].RemoteAddress) = 0
      then
      Inc(nCount);
  end;
  if nCount > nMaxConnOfIPaddr then
  begin
    Result := True;
  end;
end;

procedure TFrmMain.MENU_OPTION_IPFILTERClick(Sender: TObject);
var
  i                                     : Integer;
  sIPaddr                               : string;
begin
  frmIPaddrFilter.Top := Self.Top + 20;
  frmIPaddrFilter.Left := Self.Left;
  frmIPaddrFilter.ListBoxActiveList.Clear;
  frmIPaddrFilter.ListBoxTempList.Clear;
  frmIPaddrFilter.ListBoxBlockList.Clear;
  if ServerSocket.Active then
    for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
    begin
      sIPaddr := ServerSocket.Socket.Connections[i].RemoteAddress;
      if sIPaddr <> '' then
        frmIPaddrFilter.ListBoxActiveList.Items.AddObject(sIPaddr,
          TObject(ServerSocket.Socket.Connections[i]));
    end;

  for i := 0 to TempBlockIPList.Count - 1 do
  begin
    frmIPaddrFilter.ListBoxTempList.Items.Add(TempBlockIPList.Strings[i]);
  end;
  for i := 0 to BlockIPList.Count - 1 do
  begin
    frmIPaddrFilter.ListBoxBlockList.Items.Add(BlockIPList.Strings[i]);
  end;
  frmIPaddrFilter.EditMaxConnect.Value := nMaxConnOfIPaddr;
  case BlockMethod of
    mDisconnect: frmIPaddrFilter.RadioDisConnect.Checked := True;
    mBlock: frmIPaddrFilter.RadioAddTempList.Checked := True;
    mBlockList: frmIPaddrFilter.RadioAddBlockList.Checked := True;
  end;

  frmIPaddrFilter.EditMaxSize.Value := nMaxClientPacketSize;
  frmIPaddrFilter.EditNomSize.Value := nNomClientPacketSize;
  frmIPaddrFilter.EditMaxClientMsgCount.Value := nMaxClientMsgCount;
  frmIPaddrFilter.CheckBoxLostLine.Checked := bokickOverPacketSize;
  frmIPaddrFilter.EditClientTimeOutTime.Value := dwClientTimeOutTime div 1000;
  frmIPaddrFilter.ShowModal;

end;

procedure TFrmMain.CloseConnect(sIPaddr: string);
var
  i                                     : Integer;
  boCheck                               : Boolean;
begin
  if ServerSocket.Active then
    while (True) do
    begin
      boCheck := False;
      for i := 0 to ServerSocket.Socket.ActiveConnections - 1 do
      begin
        if sIPaddr = ServerSocket.Socket.Connections[i].RemoteAddress then
        begin
          ServerSocket.Socket.Connections[i].Close;
          boCheck := True;
          break;
        end;
      end;
      if not boCheck then
        break;
    end;
end;

procedure TFrmMain.MENU_OPTION_PERFORMClick(Sender: TObject);
begin
  frmPrefConfig.boShowOK := False;
  frmPrefConfig.Top := Self.Top + 20;
  frmPrefConfig.Left := Self.Left;
  with frmPrefConfig do
  begin
    EditServerCheckTimeOut.Value := dwCheckServerTimeOutTime div 1000;
    EditSendBlockSize.Value := nClientSendBlockSize;
    {
    EditGateIPaddr.Text:=GateAddr;
    EditGatePort.Text:=IntToStr(GatePort);
    EditServerIPaddr.Text:=ServerAddr;
    EditServerPort.Text:=IntToStr(ServerPort);
    EditTitle.Text:=TitleName;
    TrackBarLogLevel.Position:=nShowLogLevel;
    ComboBoxShowBite.ItemIndex:=Integer(boShowBite);
    }
    boShowOK := True;
    ShowModal;
  end;
end;

function TFrmMain.CheckDefMsg(DefMsg: pTDefaultMessage; SessionInfo:
  pTSessionInfo): Boolean;
begin
  Result := True;
  case DefMsg.Ident of
    CM_WALK, CM_RUN:
      begin
      end;
    CM_TURN:
      begin
      end;
    CM_HIT, CM_HEAVYHIT, CM_BIGHIT, CM_POWERHIT, CM_LONGHIT, CM_WIDEHIT,
      CM_FIREHIT:
      begin
        //      if (GetTickCount - SessionInfo.dwHitTick) > dwHitTime then dwHitTime:=GetTickCount()
        //      else Result:=False;
      end;
    CM_SPELL:
      begin
      end;
    CM_DROPITEM:
      begin
      end;
    CM_PICKUP:
      begin
      end;
  end;
end;

procedure TFrmMain.CloseAllUser;
var
  nSockIdx                              : Integer;
begin
  for nSockIdx := 0 to GATEMAXSESSION - 1 do
  begin
    if SessionArray[nSockIdx].Socket <> nil then
      SessionArray[nSockIdx].Socket.Close;
  end;
end;

procedure TFrmMain.MENU_CONTROL_RELOADCONFIGClick(Sender: TObject);
begin
  if Application.MessageBox('是否确认重新加载配置信息?',
    '确认信息',
    MB_OKCANCEL + MB_ICONQUESTION
    ) <> IDOK then
    exit;
  LoadConfig();
end;

end.

⌨️ 快捷键说明

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