usrsoc.pas

来自「FIR引擎最新源码+注册」· PAS 代码 · 共 974 行 · 第 1/3 页

PAS
974
字号
function TFrmUserSoc.LoadChrNameList(sFileName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  if FileExists(sFileName) then begin
    DenyChrNameList.LoadFromFile(sFileName);
    i := 0;
    while (True) do begin
      if DenyChrNameList.Count <= i then break;
      if Trim(DenyChrNameList.Strings[i]) = '' then begin
        DenyChrNameList.Delete(i);
        Continue;
      end;
      Inc(i);
    end;
    Result := True;
  end;
end;

function TFrmUserSoc.LoadClearMakeIndexList(sFileName: string): Boolean;
var
  i: Integer;
  nIndex: Integer;
  sLineText: string;
begin
  Result := False;
  if FileExists(sFileName) then begin
    g_ClearMakeIndex.LoadFromFile(sFileName);
    i := 0;
    while (True) do begin
      if g_ClearMakeIndex.Count <= i then break;
      sLineText := g_ClearMakeIndex.Strings[i];
      nIndex := Str_ToInt(sLineText, -1);
      if nIndex < 0 then begin
        g_ClearMakeIndex.Delete(i);
        Continue;
      end;
      g_ClearMakeIndex.Objects[i] := TObject(nIndex);
      Inc(i);
    end;
    Result := True;
  end;
end;

procedure TFrmUserSoc.ProcessGateMsg(var GateInfo: pTGateInfo);
var
  s0C: string;
  s10: string;
  s19: Char;
  i: Integer;
  UserInfo: pTUserInfo;
  nCount: Integer;
begin
  nCount := 0;
  while True do begin
    if Pos('$', GateInfo.sText) <= 0 then break;
    GateInfo.sText := ArrestStringEx(GateInfo.sText, '%', '$', s10);
    //if Pos('$', GateInfo.sText) > 0 then showmessage(GateInfo.sText);
    //%O308/127.0.0.1/127.0.0.1$
    //%A308/#2<<<<<BL<<<<<<<<<H?<lH>xq!$
    if s10 <> '' then begin
      s19 := s10[1];
      s10 := Copy(s10, 2, Length(s10) - 1);
      //s19:=UpperCase(s19);
      case s19 of
        '-': begin
            SendKeepAlivePacket(GateInfo.Socket);
            dwKeepAliveTick := GetTickCount();
          end;
        'D': begin
            s10 := GetValidStr3(s10, s0C, ['/']);
            for i := 0 to GateInfo.UserList.Count - 1 do begin
              UserInfo := GateInfo.UserList.Items[i];
              if UserInfo <> nil then begin
                if UserInfo.sConnID = s0C then begin
                  UserInfo.s2C := UserInfo.s2C + s10;
                  if Pos('!', s10) < 1 then Continue;
                  ProcessUserMsg(UserInfo);
                  break;
                end;
              end;
            end;
          end;
        'N': begin
            s10 := GetValidStr3(s10, s0C, ['/']);
            OpenUser(s0C, s10, GateInfo);
          end;
        'C': begin
            CloseUser(s10, GateInfo);
          end;
      else begin
          if nCount >= 1 then begin //2006-10-12 防止DBS溢出攻击
            GateInfo.sText := '';
            break;
          end;
          Inc(nCount);
        end;
      end;
    end else begin       //2007-01-16 防止DBS溢出攻击
      GateInfo.sText := '';
      break;
    end;
  end;
end;

procedure TFrmUserSoc.SendKeepAlivePacket(Socket: TCustomWinSocket);
begin
  if Socket.Connected then
    Socket.SendText('%++$');
end;

procedure TFrmUserSoc.SendKickUser(Socket: TCustomWinSocket; SocketHandle: string; nKickType: Integer);
begin
  if (Socket <> nil) and Socket.Connected then begin
    case nKickType of
      0: Socket.SendText('%+-' + SocketHandle + '$');
      1: Socket.SendText('%+T' + SocketHandle + '$');
      2: Socket.SendText('%+B' + SocketHandle + '$');
    end;
  end;
end;

procedure TFrmUserSoc.ProcessUserMsg(var UserInfo: pTUserInfo);
var
  s10: string;
  nC: Integer;
  nLoopCount: Integer;
begin
  nC := 0;
  nLoopCount := 0;
  while (True) do begin
    if nLoopCount > 10 then break;
    if TagCount(UserInfo.s2C, '!') <= 0 then break;
    UserInfo.s2C := ArrestStringEx(UserInfo.s2C, '#', '!', s10);
    if s10 <> '' then begin
      s10 := Copy(s10, 2, Length(s10) - 1);
      if Length(s10) >= DEFBLOCKSIZE then begin
        DeCodeUserMsg(s10, UserInfo);
      end else Inc(n4ADC20);
    end else begin
      Inc(n4ADC1C);
      if nC >= 1 then begin
        UserInfo.s2C := '';
      end;
      Inc(nC);
    end;
    Inc(nLoopCount);
  end;
end;

procedure TFrmUserSoc.OpenUser(sID, sIP: string; var GateInfo: pTGateInfo);
var
  i: Integer;
  UserInfo: pTUserInfo;
  sUserIPaddr: string;
  sGateIPaddr: string;
begin
  sGateIPaddr := GetValidStr3(sIP, sUserIPaddr, ['/']);
  for i := 0 to GateInfo.UserList.Count - 1 do begin
    UserInfo := GateInfo.UserList.Items[i];
    if (UserInfo <> nil) and (UserInfo.sConnID = sID) then begin
      Exit;
    end;
  end;
  New(UserInfo);
  UserInfo.sAccount := '';
  UserInfo.sUserIPaddr := sUserIPaddr;
  UserInfo.sGateIPaddr := sGateIPaddr;
  UserInfo.sConnID := sID;
  UserInfo.nSessionID := 0;
  UserInfo.Socket := GateInfo.Socket;
  UserInfo.s2C := '';
  UserInfo.dwTick34 := GetTickCount();
  UserInfo.dwChrTick := GetTickCount();
  UserInfo.boChrSelected := False;
  UserInfo.boChrQueryed := False;
  UserInfo.nSelGateID := GateInfo.nGateID;
  UserInfo.nDataCount := 0;
  GateInfo.UserList.Add(UserInfo);
end;

procedure TFrmUserSoc.CloseUser(sID: string; var GateInfo: pTGateInfo);
var
  i: Integer;
  UserInfo: pTUserInfo;
begin
  for i := GateInfo.UserList.Count - 1 downto 0 do begin
    UserInfo := GateInfo.UserList.Items[i];
    if (UserInfo <> nil) and (UserInfo.sConnID = sID) then begin
      if not FrmIDSoc.GetGlobaSessionStatus(UserInfo.nSessionID) then begin
        FrmIDSoc.SendSocketMsg(SS_SOFTOUTSESSION, UserInfo.sAccount + '/' + IntToStr(UserInfo.nSessionID));
        FrmIDSoc.CloseSession(UserInfo.sAccount, UserInfo.nSessionID);
      end;
      GateInfo.UserList.Delete(i);
      Dispose(UserInfo);
      break;
    end;
  end;
end;

procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
  var UserInfo: pTUserInfo);
var
  sDefMsg, s18: string;
  Msg: TDefaultMessage;
begin
  sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
  s18 := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) - DEFBLOCKSIZE);
  Msg := DecodeMessage(sDefMsg);
  case Msg.Ident of
    CM_QUERYCHR: begin
        if not UserInfo.boChrQueryed or ((GetTickCount - UserInfo.dwChrTick) > 200) then begin
          UserInfo.dwChrTick := GetTickCount();
          if QueryChr(s18, UserInfo) then begin
            UserInfo.boChrQueryed := True;
          end;
        end else begin
          if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 0);
          Inc(g_nQueryChrCount);
          MainOutMessage('[超速操作] 查询人物 ' + UserInfo.sUserIPaddr);
        end;
      end;
    CM_NEWCHR: begin
        if (GetTickCount - UserInfo.dwChrTick) > 1000 then begin
          UserInfo.dwChrTick := GetTickCount();
          if (UserInfo.sAccount <> '')
            and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
            NewChr(s18, UserInfo);
            UserInfo.boChrQueryed := False;
          end else begin
            OutOfConnect(UserInfo);
          end;
        end else begin
          if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 1);
          Inc(nHackerNewChrCount);
          MainOutMessage('[超速操作] 创建人物 ' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
        end;
      end;
    CM_DELCHR: begin
        if (GetTickCount - UserInfo.dwChrTick) > 1000 then begin
          UserInfo.dwChrTick := GetTickCount();
          if (UserInfo.sAccount <> '')
            and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
            DelChr(s18, UserInfo);
            UserInfo.boChrQueryed := False;
          end else begin
            OutOfConnect(UserInfo);
          end;
        end else begin
          if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 0);
          Inc(nHackerDelChrCount);
          MainOutMessage('[超速操作] 删除人物' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
        end;
      end;
    CM_SELCHR: begin
        if not UserInfo.boChrQueryed then begin
          if (UserInfo.sAccount <> '')
            and FrmIDSoc.CheckSession(UserInfo.sAccount, UserInfo.sUserIPaddr, UserInfo.nSessionID) then begin
            if SelectChr(s18, UserInfo) then begin
              UserInfo.boChrSelected := True;
            end;
          end else begin
            OutOfConnect(UserInfo);
          end;
        end else begin
          if boAttack and AddAttackIP(UserInfo.sUserIPaddr) then SendKickUser(UserInfo.Socket, UserInfo.sConnID, 1);
          Inc(nHackerSelChrCount);
          MainOutMessage('[端口攻击]' + UserInfo.sAccount + '/' + UserInfo.sUserIPaddr);
        end;
      end;
  else begin
      Inc(n4ADC24);
    end;
  end;
end;

function TFrmUserSoc.QueryChr(sData: string; var UserInfo: pTUserInfo): Boolean;
var
  sAccount: string;
  sSessionID: string;
  nSessionID: Integer;
  nChrCount: Integer;
  ChrList: TStringList;
  i: Integer;
  nIndex: Integer;
  ChrRecord: THumDataInfo;
  HumRecord: THumInfo;
  QuickID: pTQuickID;
  btSex: Byte;
  sChrName: string;
  sJob: string;
  sHair: string;
  sLevel: string;
  s40: string;
begin
  Result := False;
  sSessionID := GetValidStr3(DecodeString(sData), sAccount, ['/']);
  nSessionID := Str_ToInt(sSessionID, -2);
  UserInfo.nSessionID := nSessionID;
  nChrCount := 0;
  if FrmIDSoc.CheckSession(sAccount, UserInfo.sUserIPaddr, nSessionID) then begin
    FrmIDSoc.SetGlobaSessionNoPlay(nSessionID);
    UserInfo.sAccount := sAccount;
    ChrList := TStringList.Create;
    try
      if HumChrDB.Open and (HumChrDB.FindByAccount(sAccount, ChrList) >= 0) then begin
        try
          if HumDataDB.OpenEx then begin
            for i := 0 to ChrList.Count - 1 do begin
              QuickID := pTQuickID(ChrList.Objects[i]);
              //FrmDBSrv.MemoLog.Lines.Add('UserInfo.nSelGateID: '+IntToStr(UserInfo.nSelGateID)+' QuickID.nIndex: '+IntToStr(QuickID.nIndex));
              //如果选择ID不对,则跳过
              //if QuickID.nIndex <> UserInfo.nSelGateID then Continue;
              if HumChrDB.GetBy(QuickID.nIndex, HumRecord) and not HumRecord.boDeleted then begin
                sChrName := QuickID.sChrName;
                nIndex := HumDataDB.Index(sChrName);
                if (nIndex < 0) or (nChrCount >= 2) then Continue;
                if HumDataDB.Get(nIndex, ChrRecord) >= 0 then begin
                  btSex := ChrRecord.Data.btSex;
                  sJob := IntToStr(ChrRecord.Data.btJob);
                  sHair := IntToStr(ChrRecord.Data.btHair);
                  sLevel := IntToStr(ChrRecord.Data.Abil.Level);
                  if HumRecord.boSelected then s40 := s40 + '*';
                  s40 := s40 + sChrName + '/' + sJob + '/' + sHair + '/' + sLevel + '/' + IntToStr(btSex) + '/';

⌨️ 快捷键说明

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