L L4D2node

CEntitySaveRestoreBlockHandler::RestoreGlobalEntity

0x004ab9d0 · 478 bytes · __thiscall

_ZN30CEntitySaveRestoreBlockHandler19RestoreGlobalEntityEP11CBaseEntityP16CSaveRestoreDataP13entitytable_t

Decompiled

undefined (4 params)

/* CEntitySaveRestoreBlockHandler::RestoreGlobalEntity(CBaseEntity*, CSaveRestoreData*,
   entitytable_t*) */

undefined4 __thiscall
CEntitySaveRestoreBlockHandler::RestoreGlobalEntity
          (CEntitySaveRestoreBlockHandler *this,CBaseEntity *param_1,CSaveRestoreData *param_2,
          entitytable_t *param_3)

{
  float fVar1;
  float fVar2;
  char *pcVar3;
  char cVar4;
  int iVar5;
  CSaveRestoreData *pCVar6;
  int iVar7;
  CBaseEntity *pCVar8;
  undefined4 uVar9;
  undefined4 *puVar10;
  char *pcVar11;
  CEntitySaveRestoreBlockHandler *pCVar12;
  float local_50;
  float local_4c;
  float local_48;
  undefined **local_44;
  undefined4 local_40 [3];
  undefined4 local_34;
  undefined4 local_30;
  undefined4 local_24;
  
  if (param_1 != (CBaseEntity *)0x0) {
    (**(code **)(*(int *)param_1 + 0xc))(param_1);
  }
  CRestore::CRestore((CRestore *)&local_44,param_2);
  pcVar3 = *(char **)(param_3 + 0x24);
  uVar9 = *(undefined4 *)(param_3 + 0x20);
  pcVar11 = "";
  if (pcVar3 != (char *)0x0) {
    pcVar11 = pcVar3;
  }
                    /* try { // try from 004aba16 to 004abbb1 has its CatchHandler @ 004abbb7 */
  iVar5 = GlobalEntity_GetIndex(pcVar11);
  pCVar6 = (CSaveRestoreData *)GlobalEntity_GetMap(iVar5);
  if (pCVar6 == param_2 + 0x544) {
LAB_004aba44:
    pCVar8 = (CBaseEntity *)FindGlobalEntity(this,uVar9,pcVar3);
    if (pCVar8 == (CBaseEntity *)0x0) {
      pcVar11 = "";
      if (pcVar3 != (char *)0x0) {
        pcVar11 = pcVar3;
      }
      DevMsg("Warning: No match for global entity %s found in destination level\n",pcVar11);
    }
    else {
      local_24 = 1;
      uVar9 = (**(code **)(*(int *)pCVar8 + 0x1c))(pCVar8);
      pCVar12 = this;
      ModelSpaceLandmark((int)&local_50);
      fVar1 = *(float *)(param_3 + 0x30);
      fVar2 = *(float *)(param_3 + 0x28);
      *(float *)(param_2 + 0x56c) = *(float *)(param_3 + 0x2c) - local_4c;
      *(float *)(param_2 + 0x570) = fVar1 - local_48;
      *(float *)(param_2 + 0x568) = fVar2 - local_50;
      UTIL_Remove(param_1);
      puVar10 = (undefined4 *)(**(code **)(*(int *)pCVar8 + 0xc))(pCVar8,pCVar12,uVar9);
      *(undefined4 *)(param_3 + 0x10) = *puVar10;
      (**(code **)(*(int *)pCVar8 + 0x298))(pCVar8);
      GlobalEntity_SetMap(iVar5,*(undefined4 *)(gpGlobals + 0x3c));
      cVar4 = DoRestoreEntity(this,pCVar8,(IRestore *)&local_44);
      if (cVar4 != '\0') {
        *(undefined4 *)(param_2 + 0x568) = 0;
        uVar9 = 1;
        *(undefined4 *)(param_2 + 0x56c) = 0;
        *(undefined4 *)(param_2 + 0x570) = 0;
        goto LAB_004abb39;
      }
      *(undefined4 *)(param_2 + 0x568) = 0;
      *(undefined4 *)(param_2 + 0x56c) = 0;
      *(undefined4 *)(param_2 + 0x570) = 0;
    }
  }
  else {
    iVar7 = _V_stricmp((char *)(param_2 + 0x544),(char *)pCVar6);
    if (iVar7 == 0) goto LAB_004aba44;
  }
  uVar9 = 0;
LAB_004abb39:
  local_44 = &PTR_GetReadPos_00c1d008;
  local_34 = 0;
  CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)local_40);
  local_30 = local_40[0];
  CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)local_40);
  return uVar9;
}

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)