L L4D2node

CEdgeList::ReduceActiveEdgeList

0x001cda50 · 968 bytes · __thiscall

_ZN9CEdgeList20ReduceActiveEdgeListER15CWingedEdgeListff

Decompiled

undefined (4 params)

/* CEdgeList::ReduceActiveEdgeList(CWingedEdgeList&, float, float) */

void __thiscall
CEdgeList::ReduceActiveEdgeList
          (CEdgeList *this,CWingedEdgeList *param_1,float param_2,float param_3)

{
  float fVar1;
  float fVar2;
  float fVar3;
  CEdgeList *pCVar4;
  Edge_t *pEVar5;
  int iVar6;
  Edge_t *pEVar7;
  int iVar8;
  int iVar9;
  float *pfVar10;
  int iVar11;
  int iVar12;
  float *pfVar13;
  float fVar14;
  float fVar15;
  undefined2 local_28;
  int local_20;
  
  local_20 = -1;
  pEVar5 = *(Edge_t **)(this + 0x70);
  fVar1 = *(float *)(*(Edge_t **)(this + 0x70) + 0x20);
joined_r0x001cda7f:
  do {
    do {
      pEVar7 = pEVar5;
      if (pEVar7 == (Edge_t *)(this + 0x74)) {
        return;
      }
      fVar14 = *(float *)(pEVar7 + 0x20);
      if (fVar14 != fVar1) {
        for (pCVar4 = *(CEdgeList **)(this + 0xe8); pCVar4 != this + 0xf4;
            pCVar4 = *(CEdgeList **)(pCVar4 + 0x1c)) {
          *(float *)(pCVar4 + 0x14) =
               (*(float *)(pCVar4 + 0xc) - *(float *)pCVar4 * fVar14) -
               *(float *)(pCVar4 + 4) * param_2;
        }
      }
      IntroduceSingleActiveEdge(this,pEVar7,param_2);
      pEVar5 = *(Edge_t **)(pEVar7 + 0x2c);
      fVar14 = *(float *)(pEVar7 + 0x20);
      fVar1 = *(float *)(pEVar5 + 0x20);
    } while (((fVar1 == fVar14) && (*(float *)(pEVar7 + 0x18) == *(float *)(pEVar5 + 0x18))) ||
            (iVar6 = *(int *)(*(int *)(this + 0xe8) + 0x20), fVar1 = fVar14, local_20 == iVar6));
    iVar8 = iVar6;
    if (iVar6 == -1) {
      iVar8 = local_20;
    }
    iVar12 = *(int *)(this + 0x138) + -1;
    iVar11 = iVar12 * 8;
    for (; -1 < iVar12; iVar12 = iVar12 + -1) {
      iVar9 = *(short *)(*(int *)(this + 0x130) + iVar11 + 2) * 0x30 + *(int *)(param_1 + 0x7c);
      if (((*(short *)(iVar9 + 0x24) == local_20) && (*(short *)(iVar9 + 0x26) == iVar6)) &&
         ((*(float *)(iVar9 + 0x18) == *(float *)(pEVar7 + 0x18) &&
          (ABS(*(float *)(iVar9 + 0xc) - fVar14) < 0.001)))) {
        pfVar10 = *(float **)(*(int *)(this + 0x130) + iVar11 + 4);
        fVar14 = *pfVar10;
        fVar15 = pfVar10[3];
        fVar2 = pfVar10[1];
        fVar3 = pfVar10[7];
        *(float *)(iVar9 + 0x10) = param_3;
        fVar14 = (fVar15 - fVar14) * fVar3 * (param_3 - fVar2) + fVar14;
        *(float *)(iVar9 + 0xc) = fVar14;
        pfVar10 = (float *)(*(int *)(this + 0xa4) + iVar8 * 0x28);
        *(float *)(iVar9 + 0x14) = (pfVar10[3] - fVar14 * *pfVar10) - pfVar10[1] * param_3;
        local_20 = iVar6;
        if (param_3 < *(float *)(pEVar7 + 0x10)) {
          iVar8 = *(int *)(this + 300) + *(int *)(this + 0x134) * 8;
          *(int *)(this + 0x134) = *(int *)(this + 0x134) + 1;
          *(undefined4 *)(iVar8 + 4) = *(undefined4 *)(*(int *)(this + 0x130) + 4 + iVar11);
          *(undefined2 *)(iVar8 + 2) = *(undefined2 *)(*(int *)(this + 0x130) + 2 + iVar11);
        }
        goto joined_r0x001cda7f;
      }
      iVar11 = iVar11 + -8;
    }
    iVar12 = *(int *)(param_1 + 0x88);
    CUtlVector<CWingedEdgeList::WingedEdge_t,CUtlMemory<CWingedEdgeList::WingedEdge_t,int>>::
    GrowVector((CUtlVector<CWingedEdgeList::WingedEdge_t,CUtlMemory<CWingedEdgeList::WingedEdge_t,int>>
                *)(param_1 + 0x7c),1);
    CUtlVector<CWingedEdgeList::WingedEdge_t,CUtlMemory<CWingedEdgeList::WingedEdge_t,int>>::
    ShiftElementsRight((CUtlVector<CWingedEdgeList::WingedEdge_t,CUtlMemory<CWingedEdgeList::WingedEdge_t,int>>
                        *)(param_1 + 0x7c),iVar12,1);
    iVar9 = iVar12 * 0x30;
    local_28 = (undefined2)iVar6;
    iVar11 = *(int *)(param_1 + 0x7c);
    *(undefined4 *)(iVar11 + iVar9 + 0x28) = 0;
    *(undefined4 *)(iVar11 + iVar9 + 0x2c) = 0;
    pfVar10 = (float *)(*(int *)(param_1 + 0x7c) + iVar9);
    *(undefined2 *)(pfVar10 + 9) = (undefined2)local_20;
    *(undefined2 *)((int)pfVar10 + 0x26) = local_28;
    pfVar10[6] = *(float *)(pEVar7 + 0x18);
    fVar14 = *(float *)pEVar7;
    fVar15 = *(float *)(pEVar7 + 0xc);
    fVar2 = *(float *)(pEVar7 + 4);
    fVar3 = *(float *)(pEVar7 + 0x1c);
    pfVar10[1] = param_2;
    fVar14 = (fVar15 - fVar14) * fVar3 * (param_2 - fVar2) + fVar14;
    *pfVar10 = fVar14;
    pfVar13 = (float *)(*(int *)(this + 0xa4) + iVar8 * 0x28);
    pfVar10[2] = (pfVar13[3] - *pfVar13 * fVar14) - pfVar13[1] * param_2;
    fVar15 = (*(float *)(pEVar7 + 0xc) - *(float *)pEVar7) * *(float *)(pEVar7 + 0x1c) *
             (param_3 - *(float *)(pEVar7 + 4)) + *(float *)pEVar7;
    pfVar10[3] = fVar15;
    pfVar10[4] = param_3;
    pfVar13 = (float *)(iVar8 * 0x28 + *(int *)(this + 0xa4));
    pfVar10[5] = (pfVar13[3] - fVar15 * *pfVar13) - pfVar13[1] * param_3;
    if (((iVar12 != 0) &&
        (pfVar13 = (float *)(*(int *)(param_1 + 0x7c) + -0x30 + iVar9), param_2 == pfVar13[1])) &&
       (fVar15 = *pfVar13, fVar14 < fVar15)) {
      *pfVar10 = fVar15;
    }
    local_20 = iVar6;
    if (param_3 < *(float *)(pEVar7 + 0x10)) {
      iVar8 = *(int *)(this + 300) + *(int *)(this + 0x134) * 8;
      *(int *)(this + 0x134) = *(int *)(this + 0x134) + 1;
      *(short *)(iVar8 + 2) = (short)iVar12;
      *(Edge_t **)(iVar8 + 4) = pEVar7;
    }
  } 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)