L L4D2node

CBaseServer::GetClassBaseline

0x00108d10 · 292 bytes · __regparm2

_ZN11CBaseServer16GetClassBaselineEP11ServerClassPPKvPi

Decompiled

undefined (3 params)

/* CBaseServer::GetClassBaseline(ServerClass*, void const**, int*) */

undefined8 __regparm2
CBaseServer::GetClassBaseline(ServerClass *param_1,void **param_2,int *param_3)

{
  uint uVar1;
  uint uVar2;
  int iVar3;
  undefined4 uVar4;
  int *piVar5;
  bool bVar6;
  undefined4 *in_stack_00000008;
  int *in_stack_0000000c;
  undefined4 *in_stack_00000010;
  
  if (*(int *)(sv_instancebaselines._28_4_ + 0x30) == 0) {
    *in_stack_0000000c = (int)&GetClassBaseline(ServerClass*,void_const**,int*)::dummy;
    *in_stack_00000010 = 1;
    uVar4 = 1;
    goto LAB_00108dd7;
  }
  if (in_stack_00000008[4] == 0xffff) {
    Error("SV_GetInstanceBaseline: missing instance baseline for class \'%s\'",*in_stack_00000008);
  }
  uVar2 = ThreadGetCurrentId();
  if ((void **)uVar2 == g_svInstanceBaselineMutex) {
LAB_00108d57:
    DAT_00350d4c = (void **)((int)DAT_00350d4c + 1);
  }
  else {
    LOCK();
    bVar6 = g_svInstanceBaselineMutex == (void **)0x0;
    uVar1 = uVar2;
    if (!bVar6) {
      uVar1 = (uint)g_svInstanceBaselineMutex;
    }
    g_svInstanceBaselineMutex = (void **)uVar1;
    UNLOCK();
    if (bVar6) goto LAB_00108d57;
    CThreadFastMutex::Lock(0x350d48,uVar2);
  }
  piVar5 = (int *)param_3[0x30];
  if (piVar5 == (int *)0x0) {
                    /* try { // try from 00108e36 to 00108e38 has its CatchHandler @ 00108e47 */
    piVar5 = (int *)(**(code **)(*(int *)param_3[0x2f] + 0x10))
                              ((int *)param_3[0x2f],"instancebaseline");
    param_3[0x30] = (int)piVar5;
  }
                    /* try { // try from 00108d88 to 00108d8a has its CatchHandler @ 00108e47 */
  iVar3 = (**(code **)(*piVar5 + 0x30))(piVar5,in_stack_00000008[4],in_stack_00000010);
  *in_stack_0000000c = iVar3;
  uVar2 = (uint)g_svInstanceBaselineMutex;
  uVar4 = CONCAT31((int3)((uint)iVar3 >> 8),iVar3 != 0);
  param_2 = (void **)((int)DAT_00350d4c + -1);
  DAT_00350d4c = param_2;
  if (param_2 == (void **)0x0) {
    LOCK();
    g_svInstanceBaselineMutex = param_2;
    UNLOCK();
    return CONCAT44(uVar2,uVar4);
  }
LAB_00108dd7:
  return CONCAT44(param_2,uVar4);
}

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)