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

📄 usrsoc.~pa

📁 飘飘的传奇服务端院代码 能编译的 要控件 老大就让我传上去吧
💻 ~PA
📖 第 1 页 / 共 2 页
字号:
  UserInfo.Socket := GateInfo.Socket;
  UserInfo.s2C := '';
  UserInfo.dwTick34 := GetTickCount();
  UserInfo.dwChrTick := GetTickCount();
  UserInfo.boChrSelected := FALSE;
  UserInfo.boChrQueryed := FALSE;
  UserInfo.nSelGateID := GateInfo.nGateID;
  GateInfo.UserList.Add(UserInfo);
end;

procedure TFrmUserSoc.CloseUser(sID: string; var GateInfo: pTGateInfo);
var
  i: Integer;
  UserInfo: pTUserInfo;
begin
  for i := 0 to GateInfo.UserList.Count - 1 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;
      Dispose(UserInfo);
      GateInfo.UserList.Delete(i);
      break;
    end;
  end;
end;

procedure TFrmUserSoc.DeCodeUserMsg(sData: string;
  var UserInfo: pTUserInfo); //004A48E0
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, 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, 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, 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, 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) + '/';
                  Inc(nChrCount);
                end;
              end;
            end;
          end;
        finally
          HumDataDB.Close;
        end;
      end;
    finally
      HumChrDB.Close;
    end;
    ChrList.Free;
    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);
  end;
end;
procedure TFrmUserSoc.OutOfConnect(const UserInfo: pTUserInfo);
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: pTUserInfo);
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;
  try
    if HumChrDB.Open then begin
      n10 := HumChrDB.Index(sChrName);
      if n10 >= 0 then begin
        HumChrDB.Get(n10, HumRecord);
        if HumRecord.sAccount = UserInfo.sAccount then begin
          HumRecord.boDeleted := TRUE;
          HumRecord.dModDate := Now();
          HumChrDB.Update(n10, HumRecord);
          boCheck := TRUE;
        end;
      end;
    end;
  finally
    HumChrDB.Close;
  end;
  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: pTUserInfo); //004A3C08
var
  Data, sAccount, sChrName, sHair, sJob, sSex: string;
  nCode: Integer;
  Msg: TDefaultMessage;
  sMsg: string;
  HumRecord: THumInfo;
  i: Integer;
begin
  nCode := -1;
  Data := DecodeString(sData);
  Data := GetValidStr3(Data, sAccount, ['/']);
  Data := GetValidStr3(Data, sChrName, ['/']);
  Data := GetValidStr3(Data, sHair, ['/']);
  Data := GetValidStr3(Data, sJob, ['/']);
  Data := GetValidStr3(Data, sSex, ['/']);
  if Trim(Data) <> '' then nCode := 0;
  sChrName := Trim(sChrName);
  if Length(sChrName) < 3 then nCode := 0;
  if not CheckDenyChrName(sChrName) then nCode := 2;
  if not boDenyChrName then begin
    if not CheckChrName(sChrName) then nCode := 0;
    for i := 1 to Length(sChrName) do begin
      if (sChrName[i] = #$A1) or
        (sChrName[i] = ' ') or
        (sChrName[i] = '/') or
        (sChrName[i] = '@') or
        (sChrName[i] = '?') or
        (sChrName[i] = '''') or
        (sChrName[i] = '"') or
        (sChrName[i] = '\') or
        (sChrName[i] = '.') or
        (sChrName[i] = ',') or
        (sChrName[i] = ':') or
        (sChrName[i] = ';') or
        (sChrName[i] = '`') or
        (sChrName[i] = '~') or
        (sChrName[i] = '!') or
        (sChrName[i] = '#') or
        (sChrName[i] = '$') or
        (sChrName[i] = '%') or
        (sChrName[i] = '^') or
        (sChrName[i] = '&') or
        (sChrName[i] = '*') or
        (sChrName[i] = '(') or
        (sChrName[i] = ')') or
        (sChrName[i] = '-') or
        (sChrName[i] = '_') or
        (sChrName[i] = '+') or
        (sChrName[i] = '=') or
        (sChrName[i] = '|') or
        (sChrName[i] = '[') or
        (sChrName[i] = '{') or
        (sChrName[i] = ']') or
        (sChrName[i] = '}') then nCode := 0;
    end;
  end;
  if nCode = -1 then begin
    try
      HumDataDB.Lock;
      if HumDataDB.Index(sChrName) >= 0 then nCode := 2;
    finally
      HumDataDB.UnLock;
    end;
  end;
  if nCode = -1 then begin
    try
      if HumChrDB.Open then begin
        //        if HumChrDB.ChrCountOfAccount(sAccount) < 2 then begin
        FillChar(HumRecord, SizeOf(THumInfo), #0);
        HumRecord.sChrName := sChrName;
        HumRecord.sAccount := sAccount;
        HumRecord.boDeleted := FALSE;
        HumRecord.btCount := 0;
        HumRecord.Header.sName := sChrName;
        HumRecord.Header.nSelectID := UserInfo.nSelGateID;
        if HumRecord.Header.sName <> '' then
          if not HumChrDB.Add(HumRecord) then nCode := 2;
        //        end else nCode:= 3;
      end;
    finally
      HumChrDB.Close;
    end;
    if nCode = -1 then begin
      if NewChrData(sChrName, Str_ToInt(sSex, 0), Str_ToInt(sJob, 0), Str_ToInt(sHair, 0)) then
        nCode := 1;
    end else begin
      FrmDBSrv.DelHum(sChrName);
      nCode := 4;
    end;
  end;
  if nCode = 1 then begin
    Msg := MakeDefaultMsg(SM_NEWCHR_SUCCESS, 0, 0, 0, 0);
  end else begin
    Msg := MakeDefaultMsg(SM_NEWCHR_FAIL, nCode, 0, 0, 0);
  end;
  sMsg := EncodeMessage(Msg);
  SendUserSocket(UserInfo.Socket, UserInfo.sConnID, sMsg);
end;
//004A440C
function TFrmUserSoc.SelectChr(sData: string;
  var UserInfo: pTUserInfo): Boolean;
var
  sAccount: string;
  sChrName: string;
  ChrList: TStringList;
  HumRecord: THumInfo;
  i: Integer;
  nIndex: Integer;
  nMapIndex: Integer;
  QuickID: pTQuickID;
  ChrRecord: THumDataInfo;
  sCurMap: string;
  boDataOK: Boolean;
  sDefMsg: string;
  sRouteMsg: string;
  sRouteIP: string;
  nRoutePort: Integer;
begin
  Result := FALSE;
  sChrName := GetValidStr3(DecodeString(sData), sAccount, ['/']);
  boDataOK := FALSE;
  if UserInfo.sAccount = sAccount then begin
    try
      if HumChrDB.Open then begin
        ChrList := TStringList.Create;
        if HumChrDB.FindByAccount(sAccount, ChrList) >= 0 then begin
          for i := 0 to ChrList.Count - 1 do begin
            QuickID := pTQuickID(ChrList.Objects[i]);
            nIndex := QuickID.nIndex;
            if HumChrDB.GetBy(nIndex, HumRecord) then begin
              if HumRecord.sChrName = sChrName then begin
                HumRecord.boSelected := TRUE;
                HumChrDB.UpdateBy(nIndex, HumRecord);
              end else begin
                if HumRecord.boSelected then begin
                  HumRecord.boSelected := FALSE;
                  HumChrDB.UpdateBy(nIndex, HumRecord);
                end;
              end;
            end;
          end;
        end;
        ChrList.Free;
      end;
    finally
      HumChrDB.Close;
    end;
    try
      if HumDataDB.OpenEx then begin
        nIndex := HumDataDB.Index(sChrName);
        if nIndex >= 0 then begin
          HumDataDB.Get(nIndex, ChrRecord);
          sCurMap := ChrRecord.Data.sCurMap;
          boDataOK := TRUE;
        end;
      end;
    finally
      HumDataDB.Close;
    end;
  end;
  if boDataOK then begin
    nMapIndex := GetMapIndex(sCurMap);
    sDefMsg := EncodeMessage(MakeDefaultMsg(SM_STARTPLAY, 0, 0, 0, 0));
    sRouteIP := GateRouteIP(CurGate.sGateaddr, nRoutePort);
    if g_boDynamicIPMode then sRouteIP := UserInfo.sGateIPaddr; //使用动态IP
    //MainOutMessage('sRouteIP+nMapIndex+UserInfo.nSessionID:'+sRouteIP+IntToStr(nMapIndex)+IntToStr(UserInfo.nSessionID));
    sRouteMsg := EncodeString(sRouteIP + '/' + IntToStr(nRoutePort + nMapIndex));
    SendUserSocket(UserInfo.Socket,
      UserInfo.sConnID,
      sDefMsg + sRouteMsg);
    FrmIDSoc.SetGlobaSessionPlay(UserInfo.nSessionID);

    Result := TRUE;
  end else begin
    SendUserSocket(UserInfo.Socket,
      UserInfo.sConnID,
      EncodeMessage(MakeDefaultMsg(SM_STARTFAIL, 0, 0, 0, 0)));
  end;
end;
function TFrmUserSoc.GateRoutePort(sGateIP: string): Integer; //004A2724
begin
  Result := 7200;
end;
function TFrmUserSoc.GateRouteIP(sGateIP: string; var nPort: Integer): string; //0x004A258C
  function GetRoute(RouteInfo: pTRouteInfo; var nGatePort: Integer): string;
  var
    nGateIndex: Integer;
  begin
    nGateIndex := Random(RouteInfo.nGateCount);
    Result := RouteInfo.sGameGateIP[nGateIndex];
    nGatePort := RouteInfo.nGameGatePort[nGateIndex];
  end;
var
  i: Integer;
  RouteInfo: pTRouteInfo;
begin
  nPort := 0;
  Result := '';
  for i := Low(g_RouteInfo) to High(g_RouteInfo) do begin
    RouteInfo := @g_RouteInfo[i];
    if RouteInfo.sSelGateIP = sGateIP then begin
      Result := GetRoute(RouteInfo, nPort);
      break;
    end;
  end;
end;

function TFrmUserSoc.GetMapIndex(sMap: string): Integer; //0x004A24D4
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to MapList.Count - 1 do begin
    if MapList.Strings[i] = sMap then begin
      Result := Integer(MapList.Objects[i]);
      break;
    end;
  end;
end;

procedure TFrmUserSoc.SendUserSocket(Socket: TCustomWinSocket; sSessionID,
  sSendMsg: string);
//004A2E18
begin
  Socket.SendText('%' + sSessionID + '/#' + sSendMsg + '!$');
end;

//0045C2C0
function TFrmUserSoc.CheckDenyChrName(sChrName: string): Boolean;
var
  i: Integer;
begin
  Result := TRUE;
  g_CheckCode.dwThread0 := 1000700;
  for i := 0 to DenyChrNameList.Count - 1 do begin
    g_CheckCode.dwThread0 := 1000701;
    if CompareText(sChrName, DenyChrNameList.Strings[i]) = 0 then begin
      g_CheckCode.dwThread0 := 1000702;
      Result := FALSE;
      break;
    end;
  end;
  g_CheckCode.dwThread0 := 1000703;
end;

end.
d.

⌨️ 快捷键说明

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