L L4D2node

CBaseServer::ReplyReservationRequest

0x0010e3b0 · 2548 bytes · __thiscall

_ZN11CBaseServer23ReplyReservationRequestER8netadr_sR7bf_read

Decompiled

undefined (3 params)

/* CBaseServer::ReplyReservationRequest(netadr_s&, bf_read&) */

void __thiscall
CBaseServer::ReplyReservationRequest(CBaseServer *this,netadr_s *param_1,bf_read *param_2)

{
  float fVar1;
  undefined4 *puVar2;
  uint *puVar3;
  uint uVar4;
  char cVar5;
  uint uVar6;
  int iVar7;
  int iVar8;
  undefined4 uVar9;
  uint uVar10;
  undefined4 uVar11;
  KeyValues *this_00;
  char *pcVar12;
  uchar *puVar13;
  int in_GS_OFFSET;
  double dVar14;
  undefined8 uVar15;
  uint local_6d4;
  IceKey local_6b0 [56];
  uint local_678;
  uint local_674;
  uchar local_420 [8];
  uchar auStack_418 [1016];
  int local_20;
  
  iVar7 = *(int *)(param_2 + 0x14);
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (iVar7 < 0x20) {
    uVar10 = *(uint *)(param_2 + 0x10);
    puVar3 = *(uint **)(param_2 + 0x18);
    if (puVar3 == *(uint **)(param_2 + 0x1c)) {
      *(undefined4 *)(param_2 + 0x14) = 1;
      *(undefined4 *)(param_2 + 0x10) = 0;
      *(uint **)(param_2 + 0x18) = puVar3 + 1;
      param_2[4] = (bf_read)0x1;
    }
    else if (*(uint **)(param_2 + 0x1c) < puVar3) {
      param_2[4] = (bf_read)0x1;
      *(undefined4 *)(param_2 + 0x10) = 0;
    }
    else {
      *(uint **)(param_2 + 0x18) = puVar3 + 1;
      uVar6 = *puVar3;
      *(uint *)(param_2 + 0x10) = uVar6;
      if (param_2[4] == (bf_read)0x0) {
        *(int *)(param_2 + 0x14) = iVar7;
        uVar10 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar6) << ((byte)iVar7 & 0x1f) |
                 uVar10;
        *(uint *)(param_2 + 0x10) = uVar6 >> ((byte)(0x20 - iVar7) & 0x1f);
        goto LAB_0010e3fc;
      }
    }
    iVar7 = GetHostVersion();
    if (iVar7 != 0) goto LAB_0010e405;
  }
  else {
    *(int *)(param_2 + 0x14) = iVar7 + -0x20;
    uVar10 = *(uint *)(param_2 + 0x10);
    if (iVar7 + -0x20 == 0) {
      puVar2 = *(undefined4 **)(param_2 + 0x18);
      *(undefined4 *)(param_2 + 0x14) = 0x20;
      if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
        *(undefined4 *)(param_2 + 0x14) = 1;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
      }
      else {
        if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
          param_2[4] = (bf_read)0x1;
          goto LAB_0010e3f5;
        }
        *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
        *(undefined4 *)(param_2 + 0x10) = *puVar2;
      }
    }
    else {
LAB_0010e3f5:
      *(undefined4 *)(param_2 + 0x10) = 0;
    }
LAB_0010e3fc:
    uVar6 = GetHostVersion();
    if (uVar6 != uVar10) goto LAB_0010e405;
  }
  if (*(int *)(this + 0x170) == 0 && *(int *)(this + 0x16c) == 0) {
    iVar7 = (**(code **)(*(int *)this + 0xc))(this);
    iVar8 = (**(code **)(*(int *)this + 0x14))(this);
    if (iVar7 == iVar8 || iVar7 - iVar8 < 0) {
      uVar10 = (**(code **)(*(int *)this + 0xd8))(this,param_1);
      cVar5 = CanAcceptChallengesFrom(this,param_1);
      if (cVar5 == '\0') {
        uVar9 = netadr_s::ToString((netadr_s *)(this + 0x1ac),false);
        uVar11 = netadr_s::ToString(param_1,false);
        DevMsg("Reservation request from address %s, but challenges exclusive for %s\n",uVar11,uVar9
              );
      }
      else if (uVar10 == 0) {
        uVar9 = netadr_s::ToString(param_1,false);
        DevMsg("Reservation request from unknown address %s\n",uVar9);
      }
      else {
        iVar7 = *(int *)(param_2 + 0x14);
        if (iVar7 < 0x20) {
          local_6d4 = *(uint *)(param_2 + 0x10);
          puVar3 = *(uint **)(param_2 + 0x18);
          if (puVar3 == *(uint **)(param_2 + 0x1c)) {
            *(undefined4 *)(param_2 + 0x14) = 1;
            local_6d4 = 0;
            *(undefined4 *)(param_2 + 0x10) = 0;
            *(uint **)(param_2 + 0x18) = puVar3 + 1;
            param_2[4] = (bf_read)0x1;
          }
          else {
            if (*(uint **)(param_2 + 0x1c) < puVar3) {
              param_2[4] = (bf_read)0x1;
              *(undefined4 *)(param_2 + 0x10) = 0;
            }
            else {
              *(uint **)(param_2 + 0x18) = puVar3 + 1;
              uVar6 = *puVar3;
              *(uint *)(param_2 + 0x10) = uVar6;
              if (param_2[4] == (bf_read)0x0) {
                *(int *)(param_2 + 0x14) = iVar7;
                uVar4 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar7];
                *(uint *)(param_2 + 0x10) = uVar6 >> ((byte)(0x20 - iVar7) & 0x1f);
                local_6d4 = (uVar4 & uVar6) << ((byte)iVar7 & 0x1f) | local_6d4;
                goto LAB_0010e655;
              }
            }
            local_6d4 = 0;
          }
        }
        else {
          *(int *)(param_2 + 0x14) = iVar7 + -0x20;
          local_6d4 = *(uint *)(param_2 + 0x10);
          if (iVar7 + -0x20 == 0) {
            puVar2 = *(undefined4 **)(param_2 + 0x18);
            *(undefined4 *)(param_2 + 0x14) = 0x20;
            if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
              *(undefined4 *)(param_2 + 0x14) = 1;
              *(undefined4 *)(param_2 + 0x10) = 0;
              *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
            }
            else {
              if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
                param_2[4] = (bf_read)0x1;
                goto LAB_0010e648;
              }
              *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
              *(undefined4 *)(param_2 + 0x10) = *puVar2;
            }
          }
          else {
LAB_0010e648:
            *(undefined4 *)(param_2 + 0x10) = 0;
          }
LAB_0010e655:
          if ((local_6d4 - 1 < 0x400) && ((local_6d4 & 7) == 0)) {
            IceKey::IceKey(local_6b0,1);
            local_674 = uVar10 ^ 0xaa98e42c;
            local_678 = uVar10 ^ 0x5ef8ce12;
                    /* try { // try from 0010e803 to 0010e905 has its CatchHandler @ 0010ede5 */
            IceKey::set(local_6b0,(uchar *)&local_678);
            CBitRead::ReadBytes((CBitRead *)param_2,local_420,local_6d4);
            puVar13 = local_420;
            do {
              IceKey::decrypt(local_6b0,puVar13,puVar13);
              puVar13 = puVar13 + 8;
            } while (puVar13 != auStack_418 + (local_6d4 - 1 & 0xfffffff8));
            CBitRead::StartReading((CBitRead *)param_2,local_420,local_6d4,0,-1);
            iVar7 = *(int *)(param_2 + 0x14);
            if (iVar7 < 0x20) {
              uVar10 = *(uint *)(param_2 + 0x10);
              puVar2 = *(undefined4 **)(param_2 + 0x18);
              if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
                *(undefined4 *)(param_2 + 0x14) = 1;
                *(undefined4 *)(param_2 + 0x10) = 0;
                *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                param_2[4] = (bf_read)0x1;
              }
              else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
                param_2[4] = (bf_read)0x1;
                *(undefined4 *)(param_2 + 0x10) = 0;
              }
              else {
                *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                *(undefined4 *)(param_2 + 0x10) = *puVar2;
              }
              if (param_2[4] == (bf_read)0x0) {
                uVar9 = *(undefined4 *)(param_2 + 0x14);
                *(int *)(param_2 + 0x14) = iVar7;
                uVar10 = (*(uint *)(param_2 + 0x10) & (&CBitBuffer::s_nMaskTable)[0x20 - iVar7]) <<
                         ((byte)uVar9 & 0x1f) | uVar10;
                *(uint *)(param_2 + 0x10) =
                     *(uint *)(param_2 + 0x10) >> ((byte)(0x20 - iVar7) & 0x1f);
                goto LAB_0010e8cf;
              }
LAB_0010e8d6:
              uVar9 = netadr_s::ToString(param_1,false);
              Msg("ReplyReservationRequest:  Reservation request with bogus payload data from %s [%d bytes]\n"
                  ,uVar9,local_6d4);
            }
            else {
              *(int *)(param_2 + 0x14) = iVar7 + -0x20;
              uVar10 = *(uint *)(param_2 + 0x10);
              if (iVar7 + -0x20 == 0) {
                puVar2 = *(undefined4 **)(param_2 + 0x18);
                *(undefined4 *)(param_2 + 0x14) = 0x20;
                if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
                  *(undefined4 *)(param_2 + 0x14) = 1;
                  *(undefined4 *)(param_2 + 0x10) = 0;
                  *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                }
                else {
                  if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
                    param_2[4] = (bf_read)0x1;
                    goto LAB_0010e8c8;
                  }
                  *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                  *(undefined4 *)(param_2 + 0x10) = *puVar2;
                }
              }
              else {
LAB_0010e8c8:
                *(undefined4 *)(param_2 + 0x10) = 0;
              }
LAB_0010e8cf:
              if (uVar10 != 0xfeedbeef) goto LAB_0010e8d6;
            }
            IceKey::~IceKey(local_6b0);
            uVar15 = CBitRead::ReadLongLong((CBitRead *)param_2);
            pcVar12 = (char *)((ulonglong)uVar15 >> 0x20);
            uVar10 = (uint)uVar15;
            iVar7 = *(int *)(param_2 + 0x14);
            if (iVar7 < 0x20) {
              uVar6 = *(uint *)(param_2 + 0x10);
              puVar3 = *(uint **)(param_2 + 0x18);
              if (puVar3 == *(uint **)(param_2 + 0x1c)) {
                *(undefined4 *)(param_2 + 0x14) = 1;
                *(undefined4 *)(param_2 + 0x10) = 0;
                *(uint **)(param_2 + 0x18) = puVar3 + 1;
                param_2[4] = (bf_read)0x1;
              }
              else if (*(uint **)(param_2 + 0x1c) < puVar3) {
                param_2[4] = (bf_read)0x1;
                *(undefined4 *)(param_2 + 0x10) = 0;
              }
              else {
                *(uint **)(param_2 + 0x18) = puVar3 + 1;
                uVar4 = *puVar3;
                *(uint *)(param_2 + 0x10) = uVar4;
                if (param_2[4] == (bf_read)0x0) {
                  *(int *)(param_2 + 0x14) = iVar7;
                  uVar6 = ((&CBitBuffer::s_nMaskTable)[0x20 - iVar7] & uVar4) <<
                          ((byte)iVar7 & 0x1f) | uVar6;
                  *(uint *)(param_2 + 0x10) = uVar4 >> ((byte)(0x20 - iVar7) & 0x1f);
                  goto LAB_0010e96b;
                }
              }
              fVar1 = *(float *)(sv_reservation_timeout._28_4_ + 0x2c);
              uVar9 = netadr_s::ToString(param_1,false);
              DevMsg("Reservation request from %s accepted: server reserved with reservation cookie 0x%llx for %.1f seconds\n"
                     ,uVar9,uVar10,pcVar12,(double)fVar1);
              DevMsg("            settings size = %d\n",0);
              *(float *)(this + 0x174) = (float)((double)fVar1 + net_time);
              SetReservationCookie(CONCAT44(uVar10,this),pcVar12,"ReplyReservationRequest");
              *(undefined4 *)(this + 0x17c) = 0;
            }
            else {
              *(int *)(param_2 + 0x14) = iVar7 + -0x20;
              uVar6 = *(uint *)(param_2 + 0x10);
              if (iVar7 + -0x20 == 0) {
                puVar2 = *(undefined4 **)(param_2 + 0x18);
                *(undefined4 *)(param_2 + 0x14) = 0x20;
                if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
                  *(undefined4 *)(param_2 + 0x14) = 1;
                  *(undefined4 *)(param_2 + 0x10) = 0;
                  *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                }
                else {
                  if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
                    param_2[4] = (bf_read)0x1;
                    goto LAB_0010e964;
                  }
                  *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
                  *(undefined4 *)(param_2 + 0x10) = *puVar2;
                }
              }
              else {
LAB_0010e964:
                *(undefined4 *)(param_2 + 0x10) = 0;
              }
LAB_0010e96b:
              fVar1 = *(float *)(sv_reservation_timeout._28_4_ + 0x2c);
              uVar9 = netadr_s::ToString(param_1,false);
              DevMsg("Reservation request from %s accepted: server reserved with reservation cookie 0x%llx for %.1f seconds\n"
                     ,uVar9,uVar10,pcVar12,(double)fVar1);
              DevMsg("            settings size = %d\n",uVar6);
              *(float *)(this + 0x174) = (float)((double)fVar1 + net_time);
              SetReservationCookie(CONCAT44(uVar10,this),pcVar12,"ReplyReservationRequest");
              *(undefined4 *)(this + 0x17c) = 0;
              if (0 < (int)uVar6) {
                this_00 = KeyValues::operator_new((KeyValues *)0x2c,uVar10);
                    /* try { // try from 0010ea57 to 0010ea5b has its CatchHandler @ 0010edcd */
                KeyValues::KeyValues(this_00,"",(IKeyValuesSystem *)0x0,false);
                if (uVar6 < 0x259) {
                    /* try { // try from 0010ec00 to 0010ec04 has its CatchHandler @ 0010ee27 */
                  CUtlBuffer::CUtlBuffer((CUtlBuffer *)local_6b0,0,0,0);
                    /* try { // try from 0010ec16 to 0010ec7a has its CatchHandler @ 0010edfd */
                  CBitRead::ReadBytes((CBitRead *)param_2,&local_678,uVar6);
                  CUtlBuffer::Put((CUtlBuffer *)local_6b0,&local_678,uVar6);
                  KeyValues::ReadAsBinary(this_00,(CUtlBuffer *)local_6b0);
                  (**(code **)(*serverGameDLL + 0x94))(serverGameDLL,this_00);
                  uVar9 = KeyValues::GetInt(this_00,"Members/numSlots",0);
                  *(undefined4 *)(this + 0x17c) = uVar9;
                  CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)local_6b0);
                }
                if (this_00 != (KeyValues *)0x0) {
                  KeyValues::deleteThis();
                }
              }
            }
            this[0x1b8] = (CBaseServer)0x1;
            this[0x1b9] = (CBaseServer)0x1;
            *(undefined4 *)(this + 0x1bc) = *(undefined4 *)param_1;
            *(undefined4 *)(this + 0x1c0) = *(undefined4 *)(param_1 + 4);
            *(undefined2 *)(this + 0x1c4) = *(undefined2 *)(param_1 + 8);
            goto LAB_0010e405;
          }
        }
        uVar9 = netadr_s::ToString(param_1,false);
        DevMsg("ReplyReservationRequest:  Reservation request with bogus payload size from %s [%d bytes]\n"
               ,uVar9,local_6d4);
      }
    }
    else {
      uVar9 = netadr_s::ToString(param_1,false);
      DevMsg("Reservation request from %s rejected: server not empty\n",uVar9);
    }
  }
  else {
    dVar14 = (double)*(float *)(this + 0x174) - net_time;
    uVar9 = netadr_s::ToString(param_1,false);
    DevMsg("Reservation request from %s rejected: server already reserved (for %d more seconds)\n",
           uVar9,(int)dVar14);
  }
  this[0x1b8] = (CBaseServer)0x1;
  this[0x1b9] = (CBaseServer)0x0;
  *(undefined4 *)(this + 0x1bc) = *(undefined4 *)param_1;
  *(undefined4 *)(this + 0x1c0) = *(undefined4 *)(param_1 + 4);
  *(undefined2 *)(this + 0x1c4) = *(undefined2 *)(param_1 + 8);
  SendReservationStatus(this);
LAB_0010e405:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}

SourceMod gamedata

paste into addons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)

Just a Signatures{} block, ready to drop into a gamedata file. Wire it up in your plugin however you like - SDKCall, DHooks, raw memory ops, or anything else.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)