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

📄 main.pas

📁 传奇服务端代码 RunGate.rar 通讯代码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    //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('Do you want to clear the logs?',
                            'Confirm',
                            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
  CenterDialog(Handle, frmGeneralConfig.Handle);
  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
  CenterDialog(Handle, frmMessageFilterConfig.Handle);
  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
  CenterDialog(Handle, frmIPaddrFilter.Handle);
  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;
  CenterDialog(Handle, frmPrefConfig.Handle);
  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('Do you want to reload configuration?',
                            'Confirm',
                            MB_OKCANCEL + MB_ICONQUESTION
                            ) <> IDOK then exit;
  LoadConfig();
end;


{---- Adjust global SVN revision ----}
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ini: TMemIniFile;
begin
  ini := TMemIniFile.Create(PosFile);
  ini.WriteInteger('GameGate','Left',frmMain.Left);
  ini.WriteInteger('GameGate','Top',frmMain.Top);
  ini.UpdateFile;
  ini.Free; 
end;


procedure TFrmMain.CnTrayIcon1DblClick(Sender: TObject);
begin
 show;
end;

initialization
  SVNRevision('$Id: Main.pas 465 2006-10-01 15:40:03Z thedeath $');
end.

⌨️ 快捷键说明

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