L L4D2node

CSaveRestoreBlockSet::ReadRestoreHeaders

0x004acb20 · 425 bytes · __thiscall

_ZN20CSaveRestoreBlockSet18ReadRestoreHeadersEP8IRestore

Decompiled

undefined (2 params)

/* CSaveRestoreBlockSet::ReadRestoreHeaders(IRestore*) */

void __thiscall
CSaveRestoreBlockSet::ReadRestoreHeaders(CSaveRestoreBlockSet *this,IRestore *param_1)

{
  undefined4 *puVar1;
  int *piVar2;
  int iVar3;
  char *__s2;
  int iVar4;
  int iVar5;
  int iVar6;
  char *__s1;
  int local_34;
  CSaveRestoreBlockSet *local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  iVar3 = (*(code *)**(undefined4 **)param_1)(param_1);
  (**(code **)(*(int *)param_1 + 0x38))(param_1,this + 0x38,1,0,iVar3);
  (**(code **)(*(int *)param_1 + 0x38))(param_1,this + 0x3c,1,0);
  if (CUtlVectorDataopsInstantiator<10>::
      GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
      ::ops == '\0') {
    iVar5 = __cxa_guard_acquire(&CUtlVectorDataopsInstantiator<10>::
                                 GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
                                 ::ops);
    if (iVar5 != 0) {
      CUtlVectorDataopsInstantiator<10>::
      GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
      ::ops = &PTR_Save_00c1d160;
      __cxa_guard_release(&CUtlVectorDataopsInstantiator<10>::
                           GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
                           ::ops);
    }
  }
  local_24 = 0;
  local_20 = 0;
  local_28 = this + 0x40;
  (*(code *)CUtlVectorDataopsInstantiator<10>::
            GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
            ::ops[1])(&CUtlVectorDataopsInstantiator<10>::
                       GetDataOps<CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>>(CUtlVector<SaveRestoreBlockHeader_t,CUtlMemory<SaveRestoreBlockHeader_t,int>>*)
                       ::ops,&local_28,param_1);
  local_34 = 0;
  if (0 < *(int *)(this + 0x30)) {
    do {
      puVar1 = *(undefined4 **)(*(int *)(this + 0x24) + local_34 * 4);
      __s2 = (char *)(**(code **)*puVar1)(puVar1);
      iVar5 = *(int *)(this + 0x4c);
      if (0 < iVar5) {
        iVar6 = 0;
        __s1 = *(char **)(this + 0x40);
        do {
          iVar4 = strcmp(__s1,__s2);
          if (iVar4 == 0) {
            if (*(int *)(__s1 + 0x20) != -1) {
              (**(code **)(*(int *)param_1 + 4))(param_1,*(int *)(__s1 + 0x20) + iVar3);
              piVar2 = *(int **)(*(int *)(this + 0x24) + local_34 * 4);
              (**(code **)(*piVar2 + 0x18))(piVar2,param_1);
            }
            break;
          }
          iVar6 = iVar6 + 1;
          __s1 = __s1 + 0x28;
        } while (iVar6 != iVar5);
      }
      local_34 = local_34 + 1;
    } while (local_34 < *(int *)(this + 0x30));
  }
  (**(code **)(*(int *)param_1 + 4))(param_1,iVar3 + *(int *)(this + 0x38));
  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)