L L4D2node

COverlayMgr::DoClipFragment

0x001d2820 · 1196 bytes · __thiscall

_ZN11COverlayMgr14DoClipFragmentEP18moverlayfragment_tP8cplane_tPS1_S4_

Decompiled

undefined (5 params)

/* COverlayMgr::DoClipFragment(moverlayfragment_t*, cplane_t*, moverlayfragment_t**,
   moverlayfragment_t**) */

void __thiscall
COverlayMgr::DoClipFragment
          (COverlayMgr *this,moverlayfragment_t *param_1,cplane_t *param_2,
          moverlayfragment_t **param_3,moverlayfragment_t **param_4)

{
  float fVar1;
  float fVar2;
  float fVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  bool bVar7;
  float *pfVar8;
  moverlayfragment_t *pmVar9;
  moverlayfragment_t *pmVar10;
  float *pfVar11;
  float *pfVar12;
  int iVar13;
  moverlayfragment_t *pmVar14;
  int iVar15;
  float *pfVar16;
  float fVar17;
  float fVar18;
  int local_45c [3];
  float local_450;
  float local_44c;
  float local_448;
  undefined4 local_444;
  float local_440 [136];
  int aiStack_220 [132];
  
  if (param_1 == (moverlayfragment_t *)0x0) {
    return;
  }
  local_45c[2] = 0;
  local_45c[1] = 0;
  local_45c[0] = 0;
  iVar4 = *(int *)(param_1 + 0x1c);
  if (0 < iVar4) {
    fVar18 = *(float *)(param_2 + 0xc);
    fVar1 = *(float *)param_2;
    iVar15 = 0;
    fVar2 = *(float *)(param_2 + 4);
    fVar3 = *(float *)(param_2 + 8);
    pfVar8 = *(float **)(param_1 + 0x10);
    pfVar11 = pfVar8 + iVar4 * 0xd;
    do {
      fVar17 = ((*pfVar8 * fVar1 + pfVar8[1] * fVar2) - fVar18) + pfVar8[2] * fVar3;
      *(float *)((int)local_440 + iVar15 + 0x24) = fVar17;
      if (0.0001 < fVar17) {
        *(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 0;
        iVar13 = 0;
      }
      else if (-0.0001 <= fVar17) {
        *(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 2;
        iVar13 = 2;
      }
      else {
        *(undefined4 *)((int)aiStack_220 + iVar15 + 4) = 1;
        iVar13 = 1;
      }
      local_45c[iVar13] = local_45c[iVar13] + 1;
      pfVar8 = pfVar8 + 0xd;
      iVar15 = iVar15 + 4;
    } while (pfVar8 != pfVar11);
    local_440[iVar4 + 9] = local_440[9];
    aiStack_220[iVar4 + 1] = aiStack_220[1];
    if (local_45c[0] != 0) {
      if (local_45c[1] == 0) {
        pmVar9 = (moverlayfragment_t *)CopyTempFragment(this,param_1);
        *param_3 = pmVar9;
        return;
      }
      pmVar9 = (moverlayfragment_t *)CreateTempFragment(this,0);
      pmVar10 = (moverlayfragment_t *)CreateTempFragment(this,0);
      if ((pmVar10 == (moverlayfragment_t *)0x0) || (pmVar9 == (moverlayfragment_t *)0x0)) {
        DestroyTempFragment(this,pmVar9);
        DestroyTempFragment(this,pmVar10);
        return;
      }
      iVar4 = *(int *)(param_1 + 0x1c);
      if (0 < iVar4) {
        iVar13 = 0;
        iVar15 = 1;
        do {
          iVar5 = aiStack_220[iVar15];
          if (iVar5 == 2) {
            CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
                      ((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar9 + 0x10),
                       *(int *)(pmVar9 + 0x1c),(overlayvert_t *)(*(int *)(param_1 + 0x10) + iVar13))
            ;
            CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
                      ((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar10 + 0x10),
                       *(int *)(pmVar10 + 0x1c),(overlayvert_t *)(*(int *)(param_1 + 0x10) + iVar13)
                      );
          }
          else {
            if (iVar5 == 1) {
              iVar6 = *(int *)(param_1 + 0x10);
              pmVar14 = pmVar10;
LAB_001d2c11:
              CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
                        ((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar14 + 0x10)
                         ,*(int *)(pmVar14 + 0x1c),(overlayvert_t *)(iVar6 + iVar13));
            }
            else if (iVar5 == 0) {
              iVar6 = *(int *)(param_1 + 0x10);
              pmVar14 = pmVar9;
              goto LAB_001d2c11;
            }
            if ((aiStack_220[iVar15 + 1] != 2) && (iVar5 != aiStack_220[iVar15 + 1])) {
              local_444 = 0;
              local_440[0] = 0.0;
              local_440[1] = 0.0;
              local_440[2] = 0.0;
              local_440[3] = 0.0;
              local_440[4] = 0.0;
              local_440[5] = 0.0;
              local_440[7] = 0.0;
              local_440[6] = 0.0;
              local_440[8] = -NAN;
              fVar18 = local_440[iVar15 + 8] / (local_440[iVar15 + 8] - local_440[iVar15 + 9]);
              pfVar8 = (float *)(*(int *)(param_1 + 0x10) + iVar13);
              pfVar16 = (float *)(*(int *)(param_1 + 0x10) + (iVar15 % iVar4) * 0x34);
              local_44c = (pfVar16[1] - pfVar8[1]) * fVar18 + pfVar8[1];
              local_448 = (pfVar16[2] - pfVar8[2]) * fVar18 + pfVar8[2];
              local_450 = (*pfVar16 - *pfVar8) * fVar18 + *pfVar8;
              pfVar11 = &local_450;
              pfVar8 = pfVar8 + 6;
              pfVar16 = pfVar16 + 6;
              do {
                pfVar12 = pfVar11 + 2;
                pfVar11[6] = (*pfVar16 - *pfVar8) * fVar18 + *pfVar8;
                pfVar11[7] = (pfVar16[1] - pfVar8[1]) * fVar18 + pfVar8[1];
                pfVar11 = pfVar12;
                pfVar8 = pfVar8 + 2;
                pfVar16 = pfVar16 + 2;
              } while (pfVar12 != local_440);
              CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
                        ((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar9 + 0x10),
                         *(int *)(pmVar9 + 0x1c),(overlayvert_t *)&local_450);
              CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>>::InsertBefore
                        ((CUtlVector<overlayvert_t,CUtlMemory<overlayvert_t,int>> *)(pmVar10 + 0x10)
                         ,*(int *)(pmVar10 + 0x1c),(overlayvert_t *)&local_450);
            }
          }
          iVar13 = iVar13 + 0x34;
          bVar7 = iVar15 < iVar4;
          iVar15 = iVar15 + 1;
        } while (bVar7);
      }
      *param_3 = pmVar9;
      *param_4 = pmVar10;
      return;
    }
  }
  pmVar9 = (moverlayfragment_t *)CopyTempFragment(this,param_1);
  *param_4 = pmVar9;
  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)