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

📄 usrsoc.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  begin


    //0802修正
    if Pos('$', GateList[GateIndex].sText) <= 0 then
      break;
    ss := #13#10;
    GateList[GateIndex].sText := ArrestStringEx(GateList[GateIndex].sText, '%', '$', s10);
    if Pos(ss, GateList[GateIndex].sText) > 0 then
      break;
    if s10 <> '' then
    begin
      s19 := s10[1];

      Delete(s10, 1, 1);
      case Ord(s19) of
        Ord('-'):
          begin
            SendKeepAlivePacket(GateList[GateIndex].Socket);
            dwKeepAliveTick := GetTickCount();
          end;
        Ord('A'):
          begin

            s10 := GetValidStr3(s10, s0C, ['/']);
            if s0C = '' then
              break;

            for i := 0 to UserCount do
            begin
              UserInfo := GateList[GateIndex].UserList[i];

              begin
                if UserInfo.sConnID = s0C then
                begin
                  GateList[GateIndex].UserList[i].s2C := GateList[GateIndex].UserList[i].s2C + s10;
                  if Pos('!', s10) < 1 then
                    Continue;
                  ProcessUserMsg(GateList[GateIndex].UserList[i]);
                  break;
                end;
              end;

            end;
          end;
        Ord('O'):
          begin
            s10 := GetValidStr3(s10, s0C, ['/']);
            OpenUser(s0C, s10,  GateIndex);
          end;
        Ord('X'):
          begin
            CloseUser(s10,  GateIndex);
            
          end;
      end;

    end;                                                    //004A3587

  end;
end;

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

procedure TFrmUserSoc.ProcessUserMsg(var UserInfo: TUserInfo);
var
  s10                                   : string;
  nC                                    : Integer;
begin
  nC := 0;
  while (true)  do
  begin

    if TagCount(UserInfo.s2C, '!') <= 0 then
      break;
    UserInfo.s2C := ArrestStringEx(UserInfo.s2C, '#', '!', s10);
    if s10 <> '' then
    begin
//      s10 := Copy(s10, 2, Length(s10) - 1);
      Delete(s10,1,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;
  end;
end;

procedure TFrmUserSoc.OpenUser(sID, sIP: string; GateIndex:Integer);
var
  i                                     : Integer;
  UserInfo                              : TUserInfo;
  sUserIPaddr                           : string;
  sGateIPaddr                           : string;
  find:Boolean;

begin
  if not (GateIndex in [0..9]) then exit;
  if not GateList[GateIndex].IsUsed then exit;
  sGateIPaddr := GetValidStr3(sIP, sUserIPaddr, ['/']);
  find:=False;
  for i := 0 to   UserCount  do
  begin
    UserInfo :=GateList[GateIndex].UserList[i];
    if   (UserInfo.sConnID = sID) then
    begin
      exit;
    end;
    if (UserInfo.sUserIPaddr='') and (not UserInfo.IsUsered) then
    begin
      GateList[GateIndex].UserList[i].sAccount := '';
      GateList[GateIndex].UserList[i].sUserIPaddr := sUserIPaddr;
      GateList[GateIndex].UserList[i].sGateIPaddr := sGateIPaddr;
     // GateList[GateIndex].UserList[i].DBIndex:=0;
      GateList[GateIndex].UserList[i].sConnID := sID;
      GateList[GateIndex].UserList[i].nSessionID := 0;
      GateList[GateIndex].UserList[i].Socket := GateList[GateIndex].Socket;
      GateList[GateIndex].UserList[i].s2C := '';
      GateList[GateIndex].UserList[i].dwTick34 := GetTickCount();
      GateList[GateIndex].UserList[i].dwChrTick := GetTickCount();
      GateList[GateIndex].UserList[i].boChrSelected := False;
      GateList[GateIndex].UserList[i].boChrQueryed := False;
      GateList[GateIndex].UserList[i].nSelGateID := GateList[GateIndex].nGateID;
      GateList[GateIndex].UserList[i].IsUsered:=True;
      Inc(GateList[GateIndex].Count);
      Break;
    End;

  end;

end;
//004A30B8

procedure TFrmUserSoc.CloseUser(sID: string;  GateIndex:Integer);
var
  i                                     : Integer;
  UserInfo                              : TUserInfo;
begin
  if not (GateIndex in [0..9]) then exit;
  if not GateList[GateIndex].IsUsed then exit;
  for i := 0 to UserCOunt do
  begin
    UserInfo := GateList[GateIndex].UserList[i];
    if   (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;
      GateList[GateIndex].UserList[i].sUserIPaddr:='';
      GateList[GateIndex].UserList[i].IsUsered:=False;
      Dec(GateList[GateIndex].Count);
      if GateList[GateIndex].Count<0 then GateList[GateIndex].Count:=0;

      break;
    end;
  end;
end;

procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
  var UserInfo: TUserInfo);                                //004A48E0
var
  sDefMsg, s18                          : string;
  Msg                                   : TDefaultMessage;
begin
  sDefMsg := Copy(sData, 1, DEFBLOCKSIZE);
  s18 := Copy(sData, DEFBLOCKSIZE + 1, Length(sData) - DEFBLOCKSIZE);
  if Length(sDefMsg)<>DEFBLOCKSIZE then exit;
  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
          Inc(g_nQueryChrCount);
          OutMainMessage('[Hacker Attack] _QUERYCHR ' + 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
          Inc(nHackerNewChrCount);
          OutMainMessage('[Hacker Attack] _NEWCHR ' + 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
          Inc(nHackerDelChrCount);
          OutMainMessage('[Hacker Attack] _DELCHR ' + 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                                             //004A4D69
            OutOfConnect(UserInfo);
          end;
        end
        else
        begin                                               //004A4D79
         // Inc(nHackerSelChrCount);
          OutMainMessage('Double send _SELCHR ' + UserInfo.sAccount + '/' +
            UserInfo.sUserIPaddr);
        end;
      end;
  else
    begin
      Inc(n4ADC24);
    end;
  end;
end;
//004A3620

function TFrmUserSoc.QueryChr(sData: string; var UserInfo: TUserInfo): Boolean;
var
  sAccount                              : string;
  sSessionID                            : string;
  nSessionID                            : Integer;
  nChrCount                             : Integer;
  ChrList                               : TStringList;
  i                                     : Integer;
  nIndex                                : Integer;
  ChrRecord                             : THumData;
  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;


    s40 := DataModule_DB.GetChrName(sAccount ,nChrCount);
    SendUserSocket(UserInfo.Socket,
      UserInfo.sConnID,
      EncodeMessage(MakeDefaultMsg(SM_QUERYCHR, nChrCount, 0, 1, 0)) +
      EncodeString(s40));
    //*ChrName/sJob/sHair/sLevel/sSex/
  end
  else
  begin
    SendUserSocket(UserInfo.Socket,
      UserInfo.sConnID,
      EncodeMessage(MakeDefaultMsg(SM_QUERYCHR_FAIL, nChrCount, 0, 1, 0)));
    CloseUser(UserInfo.sConnID, CurGate);
    UserInfo.IsUsered:=False;
  end;
end;

procedure TFrmUserSoc.OutOfConnect(const UserInfo: TUserInfo);
//004A4844
var
  Msg                                   : TDefaultMessage;
  sMsg                                  : string;
begin
  Msg := MakeDefaultMsg(SM_OUTOFCONNECTION, 0, 0, 0, 0);
  sMsg := EncodeMessage(Msg);
  SendUserSocket(UserInfo.Socket, sMsg, UserInfo.sConnID);
end;

procedure TFrmUserSoc.DelChr(sData: string;
  var UserInfo: TUserInfo);
//004A424C
var
  sChrName                              : string;
  boCheck                               : Boolean;
  Msg                                   : TDefaultMessage;
  sMsg                                  : string;
  n10                                   : Integer;
  HumRecord                             : THumInfo;
begin
  g_CheckCode.dwThread0 := 1000300;
  sChrName := DecodeString(sData);
  boCheck := False;
  g_CheckCode.dwThread0 := 1000301;
  boCheck:=DataModule_DB.UpdateBy(sChrName,'',0,1);
  g_CheckCode.dwThread0 := 1000302;
  if boCheck then
    Msg := MakeDefaultMsg(SM_DELCHR_SUCCESS, 0, 0, 0, 0)
  else
    Msg := MakeDefaultMsg(SM_DELCHR_FAIL, 0, 0, 0, 0);

  sMsg := EncodeMessage(Msg);
  SendUserSocket(UserInfo.Socket, UserInfo.sConnID, sMsg);
  g_CheckCode.dwThread0 := 1000303;
end;

procedure TFrmUserSoc.newchr(sData: string; var UserInfo: TUserInfo); //004A3C08
var
  Data, sAccount, sChrName, sHair, sJob, sSex: string;
  nCode                                 : Integer;

⌨️ 快捷键说明

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