L L4D2node

CPhysicsHook::FindOrAddVehicleScript

0x007804c0 · 1822 bytes · __thiscall

_ZN12CPhysicsHook22FindOrAddVehicleScriptEPKcP15vehicleparams_tP15vehiclesounds_t

Decompiled

undefined (4 params)

/* CPhysicsHook::FindOrAddVehicleScript(char const*, vehicleparams_t*, vehiclesounds_t*) */

undefined4 __thiscall
CPhysicsHook::FindOrAddVehicleScript
          (CPhysicsHook *this,char *param_1,vehicleparams_t *param_2,vehiclesounds_t *param_3)

{
  bool bVar1;
  char cVar2;
  char *pcVar3;
  int iVar4;
  vehicleparams_t *pvVar5;
  vehicleparams_t *pvVar6;
  vehicleparams_t *pvVar7;
  uchar *puVar8;
  int *piVar9;
  int iVar10;
  undefined4 *puVar11;
  int iVar12;
  undefined4 *puVar13;
  int iVar14;
  int iVar15;
  int iVar16;
  vehiclesounds_t *pvVar17;
  byte bVar18;
  int local_5c;
  undefined4 local_30;
  CVehicleSoundsParser local_2c [28];
  
  bVar18 = 0;
  if (0 < *(int *)(this + 0x4c)) {
    iVar16 = 0;
    local_5c = 0;
    do {
      pcVar3 = *(char **)(*(int *)(this + 0x40) + iVar16);
      if (pcVar3 == (char *)0x0) {
        pcVar3 = "";
      }
      iVar4 = _V_stricmp(pcVar3,param_1);
      if (iVar4 == 0) {
        bVar1 = true;
LAB_0078052d:
        if (param_2 != (vehicleparams_t *)0x0) {
          iVar12 = local_5c * 0x394 + *(int *)(this + 0x40);
          puVar13 = (undefined4 *)(iVar12 + 0x34);
          iVar16 = iVar12 + 0x40;
          *(undefined4 *)param_2 = *(undefined4 *)(iVar12 + 4);
          *(undefined4 *)(param_2 + 4) = *(undefined4 *)(iVar12 + 8);
          pvVar5 = param_2 + 0x30;
          *(undefined4 *)(param_2 + 8) = *(undefined4 *)(iVar12 + 0xc);
          *(undefined4 *)(param_2 + 0xc) = *(undefined4 *)(iVar12 + 0x10);
          *(undefined4 *)(param_2 + 0x10) = *(undefined4 *)(iVar12 + 0x14);
          *(undefined4 *)(param_2 + 0x14) = *(undefined4 *)(iVar12 + 0x18);
          *(undefined4 *)(param_2 + 0x18) = *(undefined4 *)(iVar12 + 0x1c);
          *(undefined4 *)(param_2 + 0x1c) = *(undefined4 *)(iVar12 + 0x20);
          *(undefined4 *)(param_2 + 0x20) = *(undefined4 *)(iVar12 + 0x24);
          *(undefined4 *)(param_2 + 0x24) = *(undefined4 *)(iVar12 + 0x28);
          *(undefined4 *)(param_2 + 0x28) = *(undefined4 *)(iVar12 + 0x2c);
          *(undefined4 *)(param_2 + 0x2c) = *(undefined4 *)(iVar12 + 0x30);
          iVar4 = iVar12 + 0x4c;
          iVar10 = iVar12 + 0x58;
          pvVar6 = pvVar5;
          puVar11 = puVar13;
          do {
            *(undefined4 *)pvVar6 = *puVar11;
            *(undefined4 *)(pvVar6 + 4) = puVar11[1];
            *(undefined4 *)(pvVar6 + 8) = puVar11[2];
            pvVar7 = pvVar6 + 0x74;
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x3c - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + (iVar16 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x40 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar16 + (4 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x44 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar16 + (8 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x48 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + (iVar4 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x4c - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar4 + (4 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x50 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar4 + (8 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x54 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + (iVar10 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x58 - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar10 + (4 - (int)puVar13));
            *(undefined4 *)(param_2 + (int)(pvVar6 + (0x5c - (int)pvVar5))) =
                 *(undefined4 *)((int)puVar11 + iVar10 + (8 - (int)puVar13));
            *(undefined4 *)(pvVar6 + 0x30) = puVar11[0xc];
            *(undefined4 *)(pvVar6 + 0x34) = puVar11[0xd];
            *(undefined4 *)(pvVar6 + 0x38) = puVar11[0xe];
            *(undefined4 *)(pvVar6 + 0x3c) = puVar11[0xf];
            *(undefined4 *)(pvVar6 + 0x40) = puVar11[0x10];
            *(undefined4 *)(pvVar6 + 0x44) = puVar11[0x11];
            *(undefined4 *)(pvVar6 + 0x48) = puVar11[0x12];
            *(undefined4 *)(pvVar6 + 0x4c) = puVar11[0x13];
            *(undefined4 *)(pvVar6 + 0x50) = puVar11[0x14];
            *(undefined4 *)(pvVar6 + 0x54) = puVar11[0x15];
            *(undefined4 *)(pvVar6 + 0x58) = puVar11[0x16];
            *(undefined4 *)(pvVar6 + 0x5c) = puVar11[0x17];
            *(undefined4 *)(pvVar6 + 0x60) = puVar11[0x18];
            *(undefined4 *)(pvVar6 + 100) = puVar11[0x19];
            *(undefined4 *)(pvVar6 + 0x68) = puVar11[0x1a];
            *(undefined4 *)(pvVar6 + 0x6c) = puVar11[0x1b];
            *(undefined4 *)(pvVar6 + 0x70) = puVar11[0x1c];
            pvVar6 = pvVar7;
            puVar11 = puVar11 + 0x1d;
          } while (pvVar7 != param_2 + 0x200);
          puVar13 = (undefined4 *)(iVar12 + 0x204);
          for (iVar16 = 0x16; iVar16 != 0; iVar16 = iVar16 + -1) {
            *(undefined4 *)pvVar7 = *puVar13;
            puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
            pvVar7 = pvVar7 + (uint)bVar18 * -8 + 4;
          }
          puVar13 = (undefined4 *)(iVar12 + 0x25c);
          pvVar6 = param_2 + 600;
          for (iVar16 = 0x12; iVar16 != 0; iVar16 = iVar16 + -1) {
            *(undefined4 *)pvVar6 = *puVar13;
            puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
            pvVar6 = pvVar6 + (uint)bVar18 * -8 + 4;
          }
        }
        if (param_3 == (vehiclesounds_t *)0x0) {
          return 1;
        }
        if (!bVar1) {
          return 0;
        }
        iVar4 = local_5c * 0x394 + *(int *)(this + 0x40);
        iVar16 = *(int *)(iVar4 + 0x2b4);
        *(undefined4 *)(param_3 + 0x10) = 0;
        if (iVar16 != 0) {
          CUtlVector<vehicle_gear_t,CUtlMemory<vehicle_gear_t,int>>::GrowVector
                    ((CUtlVector<vehicle_gear_t,CUtlMemory<vehicle_gear_t,int>> *)(param_3 + 4),
                     iVar16);
          if (*(int *)(param_3 + 0x10) - iVar16 < 1) {
            if (0 < iVar16) {
LAB_00780a24:
              iVar10 = *(int *)(param_3 + 4);
              iVar12 = 0;
              do {
                puVar13 = (undefined4 *)(iVar12 * 0x10 + iVar10);
                if (puVar13 != (undefined4 *)0x0) {
                  *puVar13 = &PTR_GetDataDescMap_00d4a858;
                  iVar10 = *(int *)(param_3 + 4);
                }
                iVar12 = iVar12 + 1;
              } while (iVar12 < iVar16);
              iVar12 = 0;
              while( true ) {
                iVar14 = *(int *)(iVar4 + 0x2a8) + iVar12 * 0x10;
                iVar10 = iVar12 * 0x10 + iVar10;
                *(undefined4 *)(iVar10 + 4) = *(undefined4 *)(iVar14 + 4);
                *(undefined4 *)(iVar10 + 8) = *(undefined4 *)(iVar14 + 8);
                *(undefined4 *)(iVar10 + 0xc) = *(undefined4 *)(iVar14 + 0xc);
                if (iVar16 <= iVar12 + 1) break;
                iVar10 = *(int *)(param_3 + 4);
                iVar12 = iVar12 + 1;
              }
            }
          }
          else if (0 < iVar16) {
            _V_memmove((void *)((int)*(void **)(param_3 + 4) + iVar16 * 0x10),
                       *(void **)(param_3 + 4),(*(int *)(param_3 + 0x10) - iVar16) * 0x10);
            goto LAB_00780a24;
          }
        }
        iVar16 = *(int *)(iVar4 + 0x2c8);
        *(undefined4 *)(param_3 + 0x24) = 0;
        if (iVar16 != 0) {
          CUtlVector<vehicle_crashsound_t,CUtlMemory<vehicle_crashsound_t,int>>::GrowVector
                    ((CUtlVector<vehicle_crashsound_t,CUtlMemory<vehicle_crashsound_t,int>> *)
                     (param_3 + 0x18),iVar16);
          if (*(int *)(param_3 + 0x24) - iVar16 < 1) {
            if (iVar16 < 1) goto LAB_007807c1;
          }
          else {
            if (iVar16 < 1) goto LAB_007807c1;
            _V_memmove((void *)((int)*(void **)(param_3 + 0x18) + iVar16 * 0x14),
                       *(void **)(param_3 + 0x18),(*(int *)(param_3 + 0x24) - iVar16) * 0x14);
          }
          iVar14 = 0;
          iVar12 = 0;
          iVar10 = *(int *)(param_3 + 0x18);
          do {
            if ((undefined4 *)(iVar10 + iVar14) != (undefined4 *)0x0) {
              *(undefined4 *)(iVar10 + iVar14) = &PTR_GetDataDescMap_00d4a868;
              iVar10 = *(int *)(param_3 + 0x18);
            }
            iVar12 = iVar12 + 1;
            iVar14 = iVar14 + 0x14;
          } while (iVar12 < iVar16);
          iVar12 = 0;
          iVar14 = 0;
          while( true ) {
            iVar10 = iVar10 + iVar12;
            iVar14 = iVar14 + 1;
            iVar15 = *(int *)(iVar4 + 700) + iVar12;
            iVar12 = iVar12 + 0x14;
            *(undefined4 *)(iVar10 + 4) = *(undefined4 *)(iVar15 + 4);
            *(undefined4 *)(iVar10 + 8) = *(undefined4 *)(iVar15 + 8);
            *(undefined4 *)(iVar10 + 0xc) = *(undefined4 *)(iVar15 + 0xc);
            *(undefined4 *)(iVar10 + 0x10) = *(undefined4 *)(iVar15 + 0x10);
            if (iVar16 <= iVar14) break;
            iVar10 = *(int *)(param_3 + 0x18);
          }
        }
LAB_007807c1:
        *(undefined4 *)(param_3 + 0x2c) = *(undefined4 *)(iVar4 + 0x2d0);
        *(undefined4 *)(param_3 + 0x30) = *(undefined4 *)(iVar4 + 0x2d4);
        *(undefined4 *)(param_3 + 0x34) = *(undefined4 *)(iVar4 + 0x2d8);
        *(undefined4 *)(param_3 + 0x38) = *(undefined4 *)(iVar4 + 0x2dc);
        *(undefined4 *)(param_3 + 0x3c) = *(undefined4 *)(iVar4 + 0x2e0);
        *(undefined4 *)(param_3 + 0x40) = *(undefined4 *)(iVar4 + 0x2e4);
        *(undefined4 *)(param_3 + 0x44) = *(undefined4 *)(iVar4 + 0x2e8);
        *(undefined4 *)(param_3 + 0x48) = *(undefined4 *)(iVar4 + 0x2ec);
        *(undefined4 *)(param_3 + 0x4c) = *(undefined4 *)(iVar4 + 0x2f0);
        puVar13 = (undefined4 *)(iVar4 + 0x2f4);
        pvVar17 = param_3 + 0x50;
        for (iVar16 = 0x14; iVar16 != 0; iVar16 = iVar16 + -1) {
          *(undefined4 *)pvVar17 = *puVar13;
          puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
          pvVar17 = pvVar17 + (uint)bVar18 * -8 + 4;
        }
        puVar13 = (undefined4 *)(iVar4 + 0x344);
        pvVar17 = param_3 + 0xa0;
        for (iVar16 = 0x14; iVar16 != 0; iVar16 = iVar16 + -1) {
          *(undefined4 *)pvVar17 = *puVar13;
          puVar13 = puVar13 + (uint)bVar18 * -2 + 1;
          pvVar17 = pvVar17 + (uint)bVar18 * -8 + 4;
        }
        return 1;
      }
      local_5c = local_5c + 1;
      iVar16 = iVar16 + 0x394;
    } while (local_5c < *(int *)(this + 0x4c));
  }
  puVar8 = (uchar *)UTIL_LoadFileForMe(param_1,(int *)0x0);
  if (puVar8 == (uchar *)0x0) {
    return 0;
  }
  local_5c = CUtlVector<vehiclescript_t,CUtlMemory<vehiclescript_t,int>>::InsertBefore
                       ((CUtlVector<vehiclescript_t,CUtlMemory<vehiclescript_t,int>> *)(this + 0x40)
                        ,*(int *)(this + 0x4c));
  iVar4 = local_5c * 0x394;
  iVar16 = *(int *)(this + 0x40);
  AllocPooledString((char *)&local_30);
  *(undefined4 *)(iVar16 + iVar4) = local_30;
  iVar10 = iVar4 + *(int *)(this + 0x40);
  *(undefined4 *)(iVar10 + 0x2b4) = 0;
  CUtlMemory<vehicle_gear_t,int>::Purge((CUtlMemory<vehicle_gear_t,int> *)(iVar10 + 0x2a8));
  *(undefined4 *)(iVar10 + 0x2c8) = 0;
  *(undefined4 *)(iVar10 + 0x2b8) = *(undefined4 *)(iVar10 + 0x2a8);
  CUtlMemory<vehicle_crashsound_t,int>::Purge
            ((CUtlMemory<vehicle_crashsound_t,int> *)(iVar10 + 700));
  *(undefined4 *)(iVar10 + 0x2cc) = *(undefined4 *)(iVar10 + 700);
  iVar16 = 0;
  do {
    *(undefined4 *)(iVar10 + 0x2d0 + iVar16 * 4) = 0;
    iVar16 = iVar16 + 1;
  } while (iVar16 != 9);
  iVar16 = 0;
  do {
    *(undefined4 *)(iVar10 + 0x2f4 + iVar16 * 4) = 0;
    *(undefined4 *)(iVar10 + 0x344 + iVar16 * 4) = 0;
    iVar16 = iVar16 + 1;
  } while (iVar16 != 0x14);
  piVar9 = (int *)(**(code **)(*physcollision + 0x9c))(physcollision,puVar8);
  bVar1 = false;
  do {
    cVar2 = (**(code **)(*piVar9 + 0xc))(piVar9);
    while( true ) {
      if (cVar2 != '\0') {
        (**(code **)(*physcollision + 0xa4))(physcollision,piVar9);
        UTIL_FreeFile(puVar8);
        if (local_5c < 0) {
          return 0;
        }
        goto LAB_0078052d;
      }
      pcVar3 = (char *)(**(code **)(*piVar9 + 8))(piVar9);
      iVar16 = _V_stricmp(pcVar3,"vehicle");
      if (iVar16 != 0) break;
      (**(code **)(*piVar9 + 0x24))(piVar9,iVar4 + *(int *)(this + 0x40) + 4,0);
      cVar2 = (**(code **)(*piVar9 + 0xc))(piVar9);
    }
    iVar16 = _V_stricmp(pcVar3,"vehicle_sounds");
    if (iVar16 == 0) {
      CVehicleSoundsParser::CVehicleSoundsParser(local_2c);
      (**(code **)(*piVar9 + 0x20))(piVar9,iVar4 + *(int *)(this + 0x40) + 0x2a4,local_2c);
      bVar1 = true;
    }
    else {
      (**(code **)(*piVar9 + 0x28))(piVar9);
    }
  } 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)