L L4D2node

CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity>>

0x008ac100 · 469 bytes · __thiscall

_ZN20CDirectorItemManager27CollectPropPhysicsLocationsI7CHandleI11CBaseEntityEEEvPKcP20EntityPopulationInfoIT_E

Decompiled

void (3 params)

/* void CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity> >(char const*,
   EntityPopulationInfo<CHandle<CBaseEntity> >*) */

void __thiscall
CDirectorItemManager::CollectPropPhysicsLocations<CHandle<CBaseEntity>>
          (CDirectorItemManager *this,char *param_1,EntityPopulationInfo *param_2)

{
  code *pcVar1;
  int *piVar2;
  char *pcVar3;
  int iVar4;
  undefined4 *puVar5;
  int *piVar6;
  int *piVar7;
  int aiStack_64 [4];
  char *local_54;
  float local_50;
  int local_4c [3];
  char *local_40;
  int local_3c;
  int local_38;
  int local_34;
  int local_30;
  int local_2c;
  int local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  param_2[4] = (EntityPopulationInfo)0x1;
  *(char **)param_2 = param_1;
  param_2[0x30] = (EntityPopulationInfo)0x1;
  *(undefined4 *)(param_2 + 0x28) = 0;
  local_54 = "prop_physics";
  aiStack_64[3] = 0;
  piVar7 = aiStack_64 + 2;
  do {
    *piVar7 = (int)gEntList;
    piVar7[-1] = 0x8ac150;
    piVar2 = (int *)CGlobalEntityList::FindEntityByClassname
                              ((CGlobalEntityList *)*piVar7,(CBaseEntity *)piVar7[1],
                               (char *)piVar7[2]);
    if (piVar2 == (int *)0x0) {
      piVar7[4] = (int)(this + 0x41c);
      iVar4 = *(int *)(director_item_cluster_range._28_4_ + 0x2c);
      piVar7[2] = 0;
      piVar7[1] = (int)param_2;
      piVar7[3] = iVar4;
      *piVar7 = (int)this;
      piVar7[-1] = 0x8ac263;
      CollateEncounters<CHandle<CBaseEntity>>
                ((CDirectorItemManager *)*piVar7,(EntityPopulationInfo *)piVar7[1],
                 SUB41(piVar7[2],0),(float)piVar7[3],(CUtlVector *)piVar7[4]);
      if (*(int *)(director_debug_scavenge_items._28_4_ + 0x30) != 0) {
        iVar4 = *(int *)(param_2 + 0x14);
        piVar7[2] = (int)param_1;
        piVar7[3] = iVar4;
        iVar4 = *(int *)(param_2 + 0x28);
        *piVar7 = (int)"Collected %d total %s items in %d encounters \n";
        piVar7[1] = iVar4;
        piVar7[-1] = 0x8ac28d;
        Msg();
      }
      return;
    }
    piVar6 = piVar7;
    if ((*(byte *)(piVar2 + 0x53) & 1) == 0) {
      iVar4 = *piVar2;
      piVar7[1] = (int)piVar2;
      *piVar7 = (int)&local_40;
      pcVar1 = *(code **)(iVar4 + 0x20);
      piVar7[-1] = 0x8ac172;
      (*pcVar1)();
      pcVar3 = "";
      if (local_40 != (char *)0x0) {
        pcVar3 = local_40;
      }
      if (param_1 != pcVar3) {
        *piVar7 = (int)pcVar3;
        piVar7[-1] = (int)param_1;
        piVar7[-2] = 0x8ac192;
        iVar4 = _V_stricmp((char *)piVar7[-1],(char *)*piVar7);
        piVar6 = piVar7 + -1;
        if (iVar4 != 0) goto LAB_008ac138;
      }
      local_20 = 0xffffffff;
      if ((*(byte *)((int)piVar2 + 0x14d) & 8) == 0) {
        local_3c = piVar2[0xb8];
        local_38 = piVar2[0xb9];
        local_34 = piVar2[0xba];
      }
      else {
        piVar7[-1] = (int)piVar2;
        piVar7[-2] = 0x8ac2a0;
        CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar7[-1]);
        local_3c = piVar2[0xb8];
        local_38 = piVar2[0xb9];
        local_34 = piVar2[0xba];
        if ((piVar2[0x53] & 0x800U) != 0) {
          piVar7[-1] = (int)piVar2;
          piVar7[-2] = 0x8ac2df;
          CBaseEntity::CalcAbsolutePosition((CBaseEntity *)piVar7[-1]);
        }
      }
      local_30 = piVar2[0xdf];
      local_24 = 0;
      local_2c = piVar2[0xe0];
      local_28 = piVar2[0xe1];
      iVar4 = *piVar2;
      piVar7[-1] = (int)piVar2;
      pcVar1 = *(code **)(iVar4 + 0xc);
      piVar7[-2] = 0x8ac207;
      puVar5 = (undefined4 *)(*pcVar1)();
      local_20 = *puVar5;
      piVar7[1] = (int)&local_3c;
      *piVar7 = *(undefined4 *)(param_2 + 0x28);
      piVar7[-1] = (int)(param_2 + 0x1c);
      piVar7[-2] = 0x8ac225;
      CUtlVector<EntityLocationInfo<CHandle<CBaseEntity>>,CUtlMemory<EntityLocationInfo<CHandle<CBaseEntity>>,int>>
      ::InsertBefore((CUtlVector<EntityLocationInfo<CHandle<CBaseEntity>>,CUtlMemory<EntityLocationInfo<CHandle<CBaseEntity>>,int>>
                      *)piVar7[-1],*piVar7,(EntityLocationInfo *)piVar7[1]);
      piVar6 = piVar7 + -1;
    }
LAB_008ac138:
    *(char **)((int)piVar6 + 8) = "prop_physics";
    *(int **)((int)piVar6 + 4) = piVar2;
    piVar7 = piVar6;
  } while( true );
}

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)