L L4D2node

CBaseClientState::ReserveServer

0x00105b90 · 575 bytes · __cdecl

_ZN16CBaseClientState13ReserveServerERK8netadr_sS2_yP9KeyValuesP28IMatchAsyncOperationCallbackPP20IMatchAsyncOperation

Decompiled

undefined (6 params)

/* CBaseClientState::ReserveServer(netadr_s const&, netadr_s const&, unsigned long long, KeyValues*,
   IMatchAsyncOperationCallback*, IMatchAsyncOperation**) */

void CBaseClientState::ReserveServer
               (netadr_s *param_1,netadr_s *param_2,ulonglong param_3,KeyValues *param_4,
               IMatchAsyncOperationCallback *param_5,IMatchAsyncOperation **param_6)

{
  CUtlVector<Remote_t,CUtlMemory<Remote_t,int>> *this;
  char cVar1;
  undefined4 *puVar2;
  undefined4 uVar3;
  CAddressList *pCVar4;
  int iVar5;
  char *pcVar6;
  int in_GS_OFFSET;
  undefined4 *in_stack_00000020;
  netadr_s *pnVar7;
  Color local_24;
  undefined1 local_23;
  undefined1 local_22;
  undefined1 local_21;
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  NET_SetMutiplayer(true);
  if (*(int *)(param_1 + 0x158) != 0) {
    (**(code **)(*(int *)param_1 + 200))(param_1,*(int *)(param_1 + 0x174) + 0x20,0);
  }
  if (in_stack_00000020 != (undefined4 *)0x0) {
    puVar2 = operator_new(0x18);
    pnVar7 = (netadr_s *)(puVar2 + 2);
    *puVar2 = &PTR_IsFinished_002a7f08;
    puVar2[1] = 0;
                    /* try { // try from 00105c37 to 00105c5b has its CatchHandler @ 00105dd1 */
    netadr_s::SetIP(pnVar7,0);
    netadr_s::SetPort(pnVar7,0);
    netadr_s::SetType(pnVar7,3);
    puVar2[5] = param_1;
    *(undefined4 **)(param_1 + 0x154) = puVar2;
    *in_stack_00000020 = puVar2;
  }
  this = (CUtlVector<Remote_t,CUtlMemory<Remote_t,int>> *)(param_1 + 0x174);
  *(IMatchAsyncOperation ***)(param_1 + 0x158) = param_6;
  *(KeyValues **)(param_1 + 0x160) = param_4;
  *(undefined4 *)(param_1 + 0x15c) = param_3._4_4_;
  uVar3 = KeyValues::MakeCopy((KeyValues *)param_5);
  *(undefined4 *)(param_1 + 0x170) = 0;
  *(undefined4 *)(param_1 + 0x164) = uVar3;
  *(undefined8 *)(param_1 + 0x168) = 0x3810000000000000;
  param_1[0x188] = (netadr_s)0x0;
  CUtlVector<Remote_t,CUtlMemory<Remote_t,int>>::RemoveAll(this);
  pCVar4 = (CAddressList *)netadr_s::ToString(param_2,false);
  CAddressList::AddRemote((CAddressList *)this,(char *)pCVar4,"public");
  pnVar7 = (netadr_s *)param_3;
  iVar5 = netadr_s::GetType((netadr_s *)param_3);
  if (iVar5 == 3) {
    pCVar4 = (CAddressList *)netadr_s::ToString((netadr_s *)param_3,false);
    pnVar7 = (netadr_s *)this;
    CAddressList::AddRemote((CAddressList *)this,(char *)pCVar4,"private");
  }
  if (realtime < *(float *)(param_1 + 0x40) || realtime == *(float *)(param_1 + 0x40)) {
    cVar1 = ShouldUseDirectConnectAddress((CBaseClientState *)pnVar7,pCVar4);
    if (cVar1 != '\0') {
      uVar3 = netadr_s::ToString(param_1 + 0x44,false);
      local_24 = (Color)0x0;
      local_23 = 0xff;
      local_22 = 0;
      local_21 = 0xff;
      ConColorMsg(&local_24,"Adding direct connect IP to reservation %s\n",uVar3);
      pcVar6 = (char *)netadr_s::ToString(param_1 + 0x44,false);
      CAddressList::AddRemote((CAddressList *)this,pcVar6,"direct");
    }
  }
  SendReserveServerChallenge((CBaseClientState *)param_1);
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}

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)